Імпорт CSV з перервами рядків у Excel 2007


129

Я працюю над функцією експорту результатів пошуку у файл CSV, який слід відкрити в Excel. Одне з полів - це поле з текстовим текстом, яке може містити розриви рядків, коми, цитати тощо. Щоб протидіяти цьому, я загорнув це поле у ​​подвійні лапки (").

Однак, коли я імпортую дані в Excel 2007, встановлюю відповідний роздільник і встановлюю текстовий класифікатор подвійним цитуванням, розриви рядків все ще створюють нові записи при розривах рядків, де я б очікував побачити все текстове поле в одинарна клітина.

Я також спробував замінити CR / LF (\ r \ n) просто CR (\ r), і знову лише LF (\ n), але не пощастило.

Хто-небудь ще стикався з такою поведінкою, і якщо так, то як ви її виправили?

ТІА,
-J

EDIT:
Ось швидкий файл, який я написав від руки, щоб дублювати проблему.

Ідентифікатор, Ім'я, Опис
"12345", "Сміт, Джо", "Гей.
Мене звуть Джо".

Коли я імпортую це в Excel 2007, я закінчую рядок заголовка та двома записами. Зауважте, що з комою у "Сміт, Джо" обробляється належним чином. Це лише розриви ліній, які викликають проблеми.


Я переглянув файл CSV у «Блокноті ++», і, здається, все правильно. У мене є інші поля з комами, і вони належним чином імпортуються. Це лише розриви ліній, які викликають проблеми.
єремялан

4
У мене проблеми з файлами UTF8 .csv з багаторядковими даними та excel. У кінцевому підсумку я просто завантажив файл у Google Docs, відкривши його на аркуші google, а потім завантажив у форматі .xls. Це добре працює для мене таким чином.
Крезерм

Відповіді:


53

Excel (принаймні, в Office 2007 на XP) може поводитися по-різному, залежно від того, імпортується файл CSV, відкривши його з меню «Файл»> «Відкрити» або двічі клацнувши по файлу в Провіднику.

У мене є файл CSV, який знаходиться в кодуванні UTF-8 і містить нові рядки в деяких клітинках. Якщо я відкрию цей файл із меню Файл-> Відкрити Excel, з'явиться майстер "імпорту CSV", і файл неможливо правильно імпортувати: нові рядки починають новий рядок навіть при цитуванні. Якщо я відкрию цей файл, двічі клацнувши по ньому у вікні Провідника, він відкриється правильно без втручання майстра.


1
Будь-яка ідея, як отримати ті самі налаштування, що і при подвійному клацанні?
Мічіель Тален

7
Це правда! Як дивно.
Девід

5
Якщо ви користуєтесь німецькими регіональними налаштуваннями, ви повинні використовувати крапку з комою (;) замість коми (,) у своєму csv для подвійного клацання для роботи ...
user1859022

3
це не працювало для мене. З розділенням "", вона відкрила все в одному стовпчику подвійним клацанням. З ";" як роздільник було імпортовано правильно, за винятком багаторядкових текстових полів, які були імпортовані у вигляді декількох записів. У мене Excel 2010
Андрій Адаменко

2
@ user1859022 Я подвоюю це для угорської мови. насправді будь-яка локальна установка, яка використовує коску як десятковий роздільник, повинна використовувати крапку з комою як роздільник поля, щоб подвійний клацнути csv, відкритий для належної роботи
robotik

42

Жодне із запропонованих рішень не працювало для мене.

Що насправді працює (з будь-яким кодуванням):

Скопіюйте / вставте дані з csv-файлу (відкрийте в редакторі), потім виконайте "текст у стовпцях" -> не працює, все в порядку.

Перейдіть на наступну вкладку і знову скопіюйте / вставте (те саме, що ви вже маєте у своєму буфері обміну) -> автоматично працює зараз.


2
У моєму випадку це спрацювало певним чином: він правильно згорнув CSV до єдиних записів, але видалив усі дані в полі, що минає новий рядок.
Ліліенталь

1
Це спрацювало, будь-які ідеї, чому він не працює при імпорті CSV від excel?
Рафаель Сісто

1
Я можу підтвердити, що це працює, ви навіть можете вставити більше даних у різні аркуші, не повторюючи команду "текст у стовпці". Це корисно, якщо вам потрібно імпортувати кілька файлів.
Олексій

1
Чому це не працює, але ні відкриття CSV, ні додавання його як текстових даних із усіма належними налаштуваннями не працює? Дякую за пораду. Команді Copy / Paste потрібно поговорити з командою імпорту даних!
alexGIS

2
Святе лайно. це справді працює. і це має сенс, чому. Створюючи "текст у стовпці", Excel запам'ятовує налаштування, і він автоматично трансформується. Коли у вас текст вже розділений на рядки, він буде виглядати рядок за рядком і ігнорувати нові рядки. Я думаю, що MS має включити прапорець, щоб зберігати поведінку або переглядати дані. Мені байдуже, ... якщо
вигадка

28

Якщо ви робите це вручну, завантажте LibreOffice та використовуйте LibreOffice Calc для імпорту CSV. Це набагато краща робота подібних речей, ніж будь-яка версія Excel, яку я пробував, і вона може економити на XLS або XLSX, якщо потрібно, якщо вам потрібно потім перенести в Excel.

Але якщо ви застрягли в Excel і потребуєте кращого виправлення, мабуть, є спосіб. Здається, це залежить від локальної точки зору (що, на мою скромну думку, здається ідіотичним). У мене немає Excel 2007, але у мене є Excel 2010, і наведений приклад:

ID,Name,Description
"12345","Smith, Joe","Hey.
My name is Joe."

не працює. Я записав це в Блокнот і вибрав Зберегти як ..., а поруч із кнопкою "Зберегти" ви можете вибрати кодування. Я вибрав UTF-8, як було запропоновано, але не пощастило. Хоча зміна коми на крапки з комою працювала і для мене. Я нічого іншого не змінив, і він просто працював. Тому я змінив приклад, щоб виглядати так, і вибрав кодування UTF-8 під час збереження в Блокноті:

ID;Name;Description
"12345";"Smith, Joe";"Hey.
My name is Joe."

Але є улов! Єдиний спосіб його роботи - це якщо двічі клацнути файл CSV, щоб відкрити його в Excel. Якщо я спробую імпортувати дані з тексту та вибрав цей CSV, він все одно не вдається в цитованих нових рядках.

Але є ще один улов! Розділювач робочого поля (кома в оригінальному прикладі, крапка з комою в моєму випадку), схоже, залежить від регіональних налаштувань системи (встановлено в Панелі керування -> Регіон та мова). У Норвегії комою є десятковий роздільник. Здається, Excel уникає цього символу і натомість надає перевагу крапці з комою. У мене є доступ до іншого комп’ютера, встановленого на англійській мові Великобританії, і на цьому комп’ютері перший приклад із роздільником комах працює чудово (лише на подвійне клацання), а той, що має крапку з комою, фактично виходить з ладу! Стільки для взаємодії. Якщо ви хочете опублікувати цей CSV в Інтернеті, а користувачі можуть мати Excel, я думаю, ви повинні опублікувати обидві версії та запропонувати людям перевірити, який файл містить правильну кількість рядків.

Отже, всі деталі, які мені вдалося зібрати, щоб змусити це працювати:

  1. Файл повинен бути збережений як UTF-8 з BOM, як це робить Notepad, коли ви вибрали UTF-8. Я спробував UTF-8 без BOM (можна легко перемикатись у Notepad ++), але потім двічі клацнути документ не вдалося.
  2. Потрібно використовувати роздільник комами або крапку з комою, але не той, який є десятковим роздільником у ваших регіональних налаштуваннях. Можливо, інші персонажі працюють, але я не знаю, який.
  3. Ви повинні цитувати поля, які містять новий рядок із символом ".
  4. Я використовував закінчення рядків Windows (\ r \ n) і в текстовому полі, і як роздільник записів, що працює.
  5. Щоб відкрити його, потрібно двічі клацнути файл, імпорт даних із тексту не працює.

Сподіваюся, що це комусь допоможе.


Також, схоже, хитрість, згадана @sdplus, працює! Я думаю, що трапляється так, що коли ви вперше вставляєте та виконуєте маневр "текст у стовпці", ви налаштовуєте речі для розділення цитувань та полів у Excel. Вдруге, коли ви вставляєте, він використовує цю конфігурацію і правильно розбиває дані на стовпці на основі конфігурації. Але це здається дуже ручним підходом.
ketil

так, кожного разу, коли ви імпортуєте текст або робите текст у стовпець, ви повторно калібруєте, як буде працювати / копіювати / вставляти в даному сеансі. він застосовується навіть до нових створених робочих книжок, поки ви не закриєте Excel. це може також засмучувати. щойно ви використовуєте заданий роздільник для імпорту, він відокремить ваш текст, навіть якщо ви просто хочете вставити речення у комірку. вам доведеться повторно імпортувати з вкладкою як роздільник або перезапустити Excel, щоб зупинити його.
robotik

Схоже, твій фокус справді працює. Але схоже, що крапка з комою не має нічого спільного з рішенням. Проблема полягає в тому, що Excel розглядає файли CSV по-різному, залежно від регіональних налаштувань. Я з Німеччини, і для мене у файлах CSV з Excel завжди є крапки з комою, а не коми (причина цього в тому, що в Німеччині десятковий сепаратор є комою замість точки). Здається, справжнє рішення полягає в тому, що Excel завантажує файли CSV абсолютно іншими, ніж усі інші текстові файли. Тож CSV-файли, що містять розриви рядків між цитатами, здається, працюють. Усі інші текстові файли не містять.
Мартіні Б'янко

@Martini, так, у мене є норвезький Excel, і ми також використовуємо коску як десятковий роздільник, тому я згадав, як це залежить від регіональних налаштувань (хоча я називав це як локал). Можливо, я повинен перефразовувати для ясності.
ketil

Це відповідь для всіх людей у ​​регіонах, де комою є десятковий роздільник. Зауважте, що для цих регіонів Excel також використовує крапку з комою як роздільник аргументів формули ( =FOO(1;2)замість =FOO(1,2)), але явно невірно, що Excel застосовує це до аналізатора файлового формату (яка інша програма аналізує стандартний формат файлу залежно від локалі ??? )
leemes

25

Я нарешті знайшов проблему!

Виявляється, ми писали файл за допомогою кодування Unicode, а не ASCII або UTF-8. Зміна зміни кодування у FileStream, здається, вирішує проблему.

Дякую всім за всі ваші пропозиції!


29
Кодування ASCII не могло вирішити проблему для мене (хоча на MacOS), і у мене немає провідного простору, і моє поле цитується. Точно той самий документ імпортує штрафи в Google Документи. Як засмучує. До речі, не існує такого поняття, як закодований текстовий файл "Unicode". Це має бути однією з реалізацій Unicode (UTF-8, UTF-16, UTF-32 та ін.)
Бен

11
Дякую за рішення. Мені все ще цікаво, що це за відповідь, тому я спробував створити csv з розривом рядка в Excel і побачив, що це врятувало. Виявляється, Excel використовує лише канал для нового рядка в комірці. Якщо я спробую створити той самий csv у Блокноті, він буде використовувати канал feed + повернення каретки для розриву лінії. Тому для розривів рядків в одній комірці переконайтеся, що вона використовує лише канал рядка (LF або \ n), а не повернення каретки (CR або \ r). Excel використовує обидва для завершення рядка.
xr280xr

1
Кодування ASCII не
вирішило

1
Для ОС X на Macintosh збережіть як "Windows Comma Comparated (csv)". Це додає нові рядки замість розривів рядків. Він буде вказаний у випадаючому меню для форматів у розділі "Спеціальні формати".
тако

Яке кодування Unicode слід використовувати (UTF-8, UTF-16)?
Андрій Адаменко

7

Коротка відповідь

Видаліть символи нового рядка / рядка ( \nіз блокнотом ++). Excel все одно розпізнає символ повернення каретки ( \r) для розділення записів.

Довга відповідь

Як уже згадувалося, символи нового рядка підтримуються в CSV полях, але Excel не завжди справляється з ними витончено. Я зіткнувся з подібною проблемою з стороннім CSV, який, можливо, мав проблеми з кодуванням, але не покращився з кодуваннями змін.

Що для мене працювало - це видалення всіх символів нового рядка ( \n). Це призводить до згортання полів на один запис, припускаючи, що ваші записи розділені поєднанням повернення каретки та новим рядком (CR / LF). Потім Excel належним чином імпортує файл та розпізнає нові записи по поверненню каретки.

Очевидно, що більш чистим рішенням є спочатку замінити справжні нові рядки ( \r\n) тимчасовою комбінацією символів, замінивши нові рядки ( \n) на вибраний вами роздільний символ (наприклад, кома у файлі з комою з комою), а потім знову замінити тимчасові символи правильними новими рядками.


1
У мене була протилежна ситуація: \nміж рядками та \r\nвнутрішніми значеннями. Щойно зняв останній у Блокноті ++.
Рарст

5

+1 на коментар Дж. Ешлі Я також зіткнувся з цією проблемою. Виявляється, Excel вимагає:

  • Символ нового рядка ("\ n") у цитованому рядку

  • Повернення вагона та нова лінія між кожним рядом.

Напр "Тест", "Елемент багаторядкового \ n багаторядкового елемента" \ r \ n "Тест2", "Елемент багаторядкового \ n багаторядкового елемента" \ r \ n

Я використовував блокнот ++, щоб правильно розмежувати кожен рядок і використовувати лише нові рядки в рядку. Виявив це, створивши багаторядкові записи в порожньому документі excel та відкривши csv у блокноті ++.


він працював для мене лише з символом нового рядка, як як багаторядковий елемент, так і роздільник рядків, як тільки я встановив роздільник поля відповідно до моєї мови
robotik

4

Якщо поле містить провідний пробіл, Excel ігнорує подвійну цитату як текстовий класифікатор. Рішення полягає у усуненні провідних пробілів між комою (роздільником поля) та подвійним цитуванням. Наприклад:

Розбита:
Ім'я, Назва, Опис
"Джон", "Містер", "Мій детальний опис"

Робота:
Ім'я, Назва, Опис
"Джон", "Містер", "Мій детальний опис"


2
Я погоджуюся, однак, у мене немає жодного провідного простору у моїх результатах. Будь-які ідеї?
jeremyalan

нам потрібна лінія зламана :(
Лука

4

Використовуйте Google Таблиці та імпортуйте файл CSV.

Потім ви можете експортувати це для використання в Excel


1
Гарна порада! Це найзручніший метод перетворення, якщо ви не в порядку з завантаженням свого CSV до сторонньої служби (тобто неконфіденційних даних). Зауважте, що вам, можливо, доведеться вручну встановити роздільник при імпорті. І вам може знадобитися відрегулювати розмір комірки в отриманому файлі Excel, щоб він правильно відображався.
m000

Також працює з Excel в Office 365 у браузері. Я не зміг належним чином відкрити CSV з розривами рядків у клітинках за допомогою програми Excel для настільних ПК (намагаюся більшість пропозицій на цій сторінці), але Excel на office.com міг її належним чином відкрити.
georg w.

3

Якщо хтось натрапляє на цю нитку і шукає остаточну відповідь, тут йдеться (заслуга особи, яка згадує LibreOffice:

1) Встановити LibreOffice 2) Відкрити Calc та імпортувати файл 3) У моєму файлі txt поля були розділені і полями символів, укладеними у "4) зберегти як файл ODS 5) Відкрити файл ODS у Excel 6) Зберегти як .xls (x) 7) Готово 8) Це прекрасно працювало для мене і врятувало мене БОГОСТІ!


3
не потрібно економити як ODS, LibreOffice може зберегти xls (x) споконвічно
robotik

2

Вставте в Notepad ++, виберіть Кодування> Кодувати в ANSI, скопіюйте все ще раз і вставте в Excel :)


2

У мене була подібна проблема. У мене були деякі дані щебетання в MySQL. Дані мали стрічковий канал (LF або \ n) з даними. У мене була вимога експорту даних MySQL в excel. LF зіпсував мій імпорт CSV-файлу. Тому я зробив наступне -

1. From MySQL exported to CSV with Record separator as CRLF
2. Opened the data in notepad++ 
3. Replaced CRLF (\r\n) with some string I am not expecting in the Data. I used ###~###! as replacement of CRLF
4. Replaced LF (\n) with Space
5. Replaced ###~###! with \r\n, so my record separator are back.
6. Saved and then imported into Excel

ПРИМІТКА. Під час заміни CRLF або LF не забудьте встановити прапорець "Перевищено" (\ n, \ r, \ t ... Поставте прапорець [подивіться в лівій нижній частині діалогового вікна)


2

Мій досвід роботи з Excel 2010 на WinXP з французькими регіональними налаштуваннями

  • роздільник імпортованого csv повинен відповідати роздільнику списку ваших регіональних налаштувань (; у моєму випадку)
  • ви повинні двічі клацнути по файлу від провідника. не відкривайте його з Excel

1

Excel неймовірно зламаний при роботі з CSV. LibreOffice робить набагато кращу роботу. Отже, я дізнався, що:

  • Файл повинен бути закодований в UTF-8 з BOM, тому врахуйте це для всіх пунктів нижче
  • Найкращий результат, безумовно, досягається, відкривши його з File Explorer
  • Якщо відкрити його зсередини Excel, є два можливі результати:
    • Якщо він має лише символи ASCII, він, швидше за все, спрацює
    • Якщо він містить символи, що не належать до ASCII, це зіпсує ваш розрив рядків
  • Здається, це сильно залежить від десяткового роздільника, налаштованого в регіональних налаштуваннях ОС, тому вам потрібно вибрати правильний
  • Я б сказав, що він може поводитися по-різному залежно від версії ОС та Office

Ви стверджуєте, що LibreOffice краще здогадується, ніж Excel, правда? Excel задає всі правильні запитання під час імпорту текстових файлів, якщо ви не скажете йому вгадати.
Том Блоджет

1
Спасибі! Це допомагає мені перетворити свій CSV з "UTF-8 без BOM" в "UTF-8 з BOM" (просто в меню "UTF-8") за допомогою Notepad ++. Потім я просто відкрив його з Explorer і Excel показав це належним чином з правильними символами та правильними розривами рядків всередині комірок. Коли я відкрив його за замовчуванням "UTF-8 без BOM", кодування з Explorer Excel імпортованого рядка розбивається правильно, але відображає не латинські символи неправильно. Якщо я відкрив його з Excel, він показав кодування правильно, але не впорався з розривами рядків.
Сергій Білоглазов

1

Огляд

Майже через 10 років після початкової публікації Excel не покращився в імпорті CSV-файлів. Однак я виявив, що це набагато краще в імпорті таблиць HTML. Таким чином, можна використовувати Python для перетворення CSV в HTML, а потім імпортувати отриманий HTML в Excel.

Перевагами цього підходу є: (а) він надійно працює, (б) вам не потрібно надсилати свої дані сторонній службі (наприклад, аркушам Google), (в) не потрібні додаткові "жирні" установки (LibreOffice, Числа тощо) для більшості користувачів, (г) вищий рівень, ніж змішування з символами CR / LF та маркерами BOM, (д) ​​не потрібно поспішати з налаштуваннями місцевості.

Кроки

Наступні кроки можна виконати на будь-якій баш-оболонці, поки встановлено Python 3. Хоча Python може використовуватися для прямого зчитування CSV, csvkit використовується для проміжного перетворення в JSON. Це дозволяє нам не стикатися з тонкощами CSV у нашому коді Python.

Спочатку збережіть такий сценарій як json2html.py. Сценарій читає файл JSON зі stdin і скидає його у вигляді таблиці HTML:

#!/usr/bin/env python3
import sys, json, html

if __name__ == '__main__':
    header_emitted = False
    make_th = lambda s: "<th>%s</th>" % (html.escape(s if s else ""))
    make_td = lambda s: "<td>%s</td>" % (html.escape(s if s else ""))
    make_tr = lambda l, make_cell: "<tr>%s</tr>" % ( "".join([make_cell(v) for v in l]) )
    print("<html><body>\n<table>")
    for line in json.load(sys.stdin):
        lk, lv = zip(*line.items())
        if not header_emitted:
            print(make_tr(lk, make_th))
            header_emitted = True
        print(make_tr(lv, make_td))
    print("</table\n</body></html>")

Потім встановіть csvkit у віртуальному середовищі та використовуйте csvjsonдля подачі вхідного файлу до нашого сценарію. Доречно вимкнути відгадування типу клітини -Iаргументом:

$ virtualenv -p python3 pyenv
$ . ./pyenv/bin/activate
$ pip install csvkit
$ csvjson -I input.csv | python3 json2html.py > output.html

Тепер output.htmlїх можна імпортувати в Excel. Лінійні розриви в клітинах збереглися.

За бажанням ви можете очистити віртуальне середовище Python:

$ deactivate
$ rm -rf pyenv

1

Це для Excel 2016:

Просто була така ж проблема з розривами рядків всередині CSV-файлу з майстром Excel.

Згодом я спробував це за допомогою функції "Новий запит": Дані -> Новий запит -> З файлу -> З CSV -> Виберіть файл -> Імпорт -> Завантажити

Це працювало чудово і дуже швидко вирішило всіх, хто має однакові проблеми.


0

Що тільки що працювало для мене, імпорт в Excel безпосередньо за умови, що імпорт виконується як текстовий формат, а не у форматі CSV. М /


0

просто створіть новий аркуш із клітинками з linebreak, збережіть його в csv, потім відкрийте його в редакторі, який може показувати кінець символів рядка (наприклад, блокнот ++). Роблячи це, ви помітите, що розрив рядка в комірці кодується LF, тоді як "реальним" кінцем рядка є код з CR LF. Voilà, тепер ви знаєте, як створити "правильний" CSV-файл для excel.


0

У мене також була така проблема: т. Е. Файли csv (розділені комами, подвійні цитати з обмеженими рядками) з LF у рядках, що цитуються. Це були завантажені квадратні файли. Я імпортував дані, але замість того, щоб імпортувати як текстові файли, імпортував як "з HTML". Цього разу вона проігнорувала НЧ у цитуваних рядках.


0

Це працювало на Mac, використовуючи csv та відкриваючи файл у Excel.

Використання python для запису файлу CSV.

data = '"перший рядок комірки a1 \ r 2-й рядок у комірці a1 \ r 3-й рядок у комірці a1", "комірка b1", "1-й рядок у комірці c1 \ r 2-й рядок у клітині c1" \ n "перший рядок у комірка a2 "\ n"

file.write (дані)


0

На MacOS спробуйте використовувати Numbers

Якщо у вас є доступ до Mac OS, я виявив, що " Числа електронних таблиць Apple" добре справляється з видаленням складного багаторядкового файлу CSV, з яким Excel не може працювати. Просто відкрийте за .csvдопомогою Numbers і експортуйте в Excel.


0

У моєму випадку відкриваю CSV у блокноті ++ та додаючи, SEP=","як перший рядок дозволяє мені відкривати CSV з розривами рядків та utf-8 в Excel без проблем


0

Замініть роздільник на TAB (\ t) замість коми (,). Потім відкрийте файл у своєму редакторі (Блокноті тощо), скопіюйте вміст звідти, а потім вставте його у файл Excel.


Спробуйте це на великих файлах :)
chukko

-1

Розрив рядків у подвійних лапках ідеально відповідає стандарту CSV. Аналіз розривів рядків у Excel залежить від налаштування ОС роздільника списку:

  1. Windows: вам потрібно встановити сепаратор списку на коми (Регіон та мова »Формати» Додатково) Джерело: /superuser/238944/how-to-force-excel-to-open-csv-files- з даними, впорядкованими в стовпці # відповідь-633302

  2. Mac: Потрібно змінити регіон на США (потім вручну змінити інші налаштування на ваш уподобання) Джерело: https://answers.microsoft.com/en-us/mac/forum/macoffice2016-macexcel/line-separator-comma -semicolon-in-excel-2016-for / 7db1b1a0-0300-44ba-ab9b-35d1c40159c6 (див. відповідь NewmanLee)

Не забудьте повністю закрити Excel перед повторною спробою.

Я успішно повторив проблему і зміг її виправити, використовуючи вищезазначене як у Max, так і в Windows.


Я не думаю, що це працює. Я експортував CSV з розривами рядків у клітинках із самого Excel. Оскільки локаль не змінився, Excel повинен був вміти правильно його завантажувати. Але це не може. Він все ще псується з розривом лінії в осередках.
m000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.