Импорт CSV с разрывами строк в Excel 2007


130

Я работаю над функцией экспорта результатов поиска в файл CSV, который будет открыт в Excel. Одно из полей - это поле с произвольным текстом, которое может содержать разрывы строк, запятые, цитаты и т. Д. Чтобы противодействовать этому, я заключил поле в двойные кавычки (").

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

Я также попытался заменить CR / LF (\ r \ n) только на CR (\ r) и снова только на LF (\ n), но не повезло.

Кто-нибудь еще сталкивался с таким поведением, и если да, то как вы его исправили?

TIA,
-J

РЕДАКТИРОВАТЬ:
Вот небольшой файл, который я написал вручную, чтобы воспроизвести проблему.

ID, имя, описание
«12345», «Смит, Джо», «Привет.
Меня зовут Джо».

Когда я импортирую это в Excel 2007, я получаю строку заголовка и две записи. Обратите внимание, что запятая в «Смит, Джо» обрабатывается правильно. Проблемы возникают только из-за разрывов строк.


Я просмотрел файл CSV в Notepad ++, и все оказалось правильно. У меня есть другие поля с запятыми, и они правильно импортируются. Проблемы возникают только из-за разрывов строк.
jeremyalan

4
У меня проблемы с CSV-файлами UTF8 с многострочными данными и Excel. В итоге я просто загрузил файл в Google Docs, открыл его в листе Google, а затем загрузил как файл .xls. Мне этот способ подходит.
Creuzerm

Ответы:


53

Excel (по крайней мере, в Office 2007 на XP) может вести себя по-разному в зависимости от того, импортируется ли CSV-файл, открыв его из меню «Файл-> Открыть» или дважды щелкнув файл в проводнике.

У меня есть CSV-файл в кодировке UTF-8, содержащий символы новой строки в некоторых ячейках. Если я открою этот файл из меню Excel File-> Open, появится мастер «импорта CSV», и файл не может быть правильно импортирован: новые строки начинают новую строку даже в кавычках. Если я открою этот файл двойным щелчком по нему в окне проводника, он откроется правильно без вмешательства мастера.


1
Есть идеи, как получить те же настройки, что и при двойном щелчке?
Michiel Thalen

7
Это так! Как странно.
Дэвид

5
Если вы используете немецкие региональные настройки, вам нужно использовать точку с запятой (;) вместо запятой (,) в вашем CSV, чтобы двойной щелчок работал ...
user1859022

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

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

42

Ни одно из предложенных решений не помогло мне.

Что на самом деле работает (с любой кодировкой):

Скопировать / вставить данные из csv-файла (открыть в редакторе), затем выполнить «текст в столбцах» -> не работает, все в порядке.

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


2
В моем случае это сработало: он правильно свернул CSV на отдельные записи, но удалил все данные в поле за новой строкой.
Лилиенталь

1
Это сработало, есть идеи, почему это не работает при импорте csv из Excel?
Рафаэль Систо

1
Я могу подтвердить, что это работает, вы даже можете вставлять больше данных в разные листы, не повторяя команду «текст в столбцы». Это полезно, если вам нужно импортировать несколько файлов.
Alex

1
Почему это работает, но ни открытие CSV, ни добавление его как текстовых данных со всеми соответствующими настройками не работают? Спасибо за чаевые. Команда копирования / вставки должна поговорить с командой импорта данных!
AlexGIS 07

2
Ебена мать. это действительно работает. и понятно почему. При преобразовании текста в столбцы Excel запоминает настройки и автоматически преобразуется. Если у вас есть текст, уже разделенный на строки, он будет выглядеть строка за строкой и игнорировать новые строки. Я думаю, что MS должна включить флажок, чтобы сохранить поведение или повторно сканировать данные. Мне все равно, ... если
черт возьми,

29

Если вы делаете это вручную, загрузите 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 со спецификацией, что и делает Блокнот, когда вы выбираете UTF-8. Я попробовал UTF-8 без спецификации (можно легко переключить в 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 Docs. Какое разочарование. Кстати, не существует такой вещи, как текстовый файл в кодировке «Unicode». Это должна быть одна из реализаций Unicode (UTF-8, UTF-16, UTF-32 и т. Д.)
Бен,

11
Спасибо за решение. Мне все еще было любопытно, каков ответ, поэтому я попытался создать CSV с разрывом строки в Excel и посмотреть, что он сохранил. Оказывается, Excel использует только перевод строки для новой строки в ячейке. Если я попытаюсь создать тот же CSV в Блокноте, он будет использовать перевод строки + возврат каретки для разрыва строки. Поэтому для разрывов строк в одной ячейке убедитесь, что используется только перевод строки (LF или \ n), а не возврат каретки (CR или \ r). Excel использует оба варианта для завершения строки.
xr280xr

1
Кодирование ASCII тоже не устранило проблему - Excel 2000, Windows 7.
ChrisJJ

1
Для OS X на Macintosh сохраните как «Windows Comma Separated (csv)». Это добавляет новые строки вместо разрывов строк. Он будет указан в раскрывающемся меню для форматов в разделе «Специальные форматы».
taco

Какую кодировку Unicode следует использовать (UTF-8, UTF-16)?
Андрей Адаменко

7

Короткий ответ

Удалите символы новой строки / перевода строки ( \nс помощью Notepad ++). Excel по-прежнему распознает символ возврата каретки ( \r) для разделения записей.

Длинный ответ

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

Для меня сработало удаление всех символов новой строки ( \n). Это приводит к сворачиванию полей в одну запись при условии, что ваши записи разделены комбинацией возврата каретки и новой строки (CR / LF). Затем Excel правильно импортирует файл и распознает новые записи по возврату каретки.

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


1
У меня была противоположная ситуация: \nмежду строками и \r\nвнутри значений. Только что убрал последний в Notepad ++.
Rarst

5

+1 к комментарию Дж. Эшли. Я тоже столкнулся с этой проблемой. Оказывается, Excel требует:

  • Символ новой строки ("\ n") в строке в кавычках

  • Возврат каретки и новая строка между каждой строкой.

Например, «Тест», «Многострочный элемент \ n многострочный элемент» \ r \ n «Тест2», «Многострочный элемент \ n многострочный элемент» \ r \ n

Я использовал блокнот ++, чтобы правильно разграничить каждую строку и использовать только новые строки в строке. Обнаружил это, создав многострочные записи в пустом документе Excel и открыв csv в блокноте ++.


это сработало для меня только с символом новой строки как многострочным элементом и разделителем строк, как только я установил разделитель полей в соответствии с моей
локалью

4

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

Сломано:
Имя, Заголовок, Описание
«Джон», «Мистер», «Мое подробное описание»

Рабочие:
Имя, Заголовок, Описание
«Джон», «Мистер», «Мое подробное описание»


2
Я согласен, однако в моем выводе нет начальных пробелов. Любые идеи?
jeremyalan

нам нужно разорвать линию :(
Люк

4

Используйте Google Таблицы и импортируйте файл CSV.

Затем вы можете экспортировать это для использования в Excel.


1
Хороший совет! Это наиболее удобный метод конвертации, если вы согласны с загрузкой CSV-файла в сторонний сервис (т.е. неконфиденциальные данные). Обратите внимание, что вам, возможно, придется вручную установить разделитель при импорте. И вам может потребоваться изменить размер ячейки в итоговом файле Excel, чтобы он отображался правильно.
m000 04

Также работает с Excel в Office 365 в браузере. Я не мог должным образом открыть CSV с разрывами строк внутри ячеек с помощью настольного приложения Excel (пробуя большинство предложений с этой страницы), но Excel на office.com мог правильно открыть его.
георг в.

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

У меня была похожая проблема. У меня были данные Twitter в 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 ... Checkbox [посмотрите на левую нижнюю часть диалогового окна)


2

Мой опыт работы с Excel 2010 на WinXP с французскими региональными настройками

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

1

Excel невероятно ломается при работе с CSV. LibreOffice работает намного лучше. Итак, я узнал, что:

  • Файл должен быть закодирован в UTF-8 с BOM, поэтому учтите это для всех пунктов ниже.
  • Наилучший результат, безусловно, достигается при открытии его из проводника.
  • Если вы откроете его из Excel, есть два возможных результата:
    • Если он содержит только символы ASCII, он, скорее всего, сработает
    • Если он содержит символы, отличные от ASCII, он испортит ваши разрывы строк
  • Кажется, что это сильно зависит от десятичного разделителя, настроенного в региональных настройках ОС, поэтому вам нужно выбрать правильный
  • Могу поспорить, что он также может вести себя по-разному в зависимости от ОС и версии Office.

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

1
Спасибо! Это помогает мне конвертировать мой CSV из «UTF-8 без спецификации» в «UTF-8 с спецификацией» (просто «UTF-8» в меню) с помощью Notepad ++. Затем я просто открыл его из проводника, и Excel правильно показал его с правильными символами и правильными разрывами строк внутри ячеек. Когда я открыл его в кодировке «UTF-8 без спецификации» по умолчанию из Explorer, импортированные в Excel разрывы строк были правильно, но отображались нелатинские символы неправильно. Если бы я открыл его из Excel, он показал правильную кодировку, но не справился с переносами строк.
Сергей Белоглазов

1

обзор

Спустя почти 10 лет после первоначальной публикации Excel не улучшил импорт файлов CSV. Однако я обнаружил, что он намного лучше импортирует таблицы HTML. Итак, можно использовать Python для преобразования CSV в HTML, а затем импортировать полученный HTML в Excel.

Преимущества этого подхода: (а) он работает надежно, (б) вам не нужно отправлять свои данные в стороннюю службу (например, таблицы Google), (в) не требуется дополнительных «толстых» установок (LibreOffice, Числа и т. Д.) Для большинства пользователей, (d) более высокий уровень, чем вмешательство с символами CR / LF и маркерами спецификации, (e) нет необходимости возиться с настройками локали.

меры

Следующие шаги можно выполнить в любой оболочке, подобной bash, если установлен Python 3. Хотя Python можно использовать для прямого чтения CSV, csvkit используется для промежуточного преобразования в JSON. Это позволяет нам избежать тонкостей CSV в нашем коде Python.

Сначала сохраните следующий сценарий как json2html.py. Скрипт считывает файл JSON со стандартного ввода и выгружает его в виде таблицы 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. M /


0

просто создайте новый лист с ячейками с переносом строки, сохраните его в csv, затем откройте его с помощью редактора, который может отображать символы конца строки (например, блокнот ++). Сделав это, вы заметите, что разрыв строки в ячейке кодируется с помощью LF, а «настоящий» конец строки - это код с CR LF. Вуаля, теперь вы знаете, как сгенерировать "правильный" CSV-файл для Excel.


0

У меня также была эта проблема: например, файлы csv (строки с разделителями-запятыми, разделенные двойными кавычками строки) с LF в строках в кавычках. Это были загруженные файлы Square. Я сделал импорт данных, но вместо импорта в виде текстовых файлов, импортированных как «из HTML». На этот раз он проигнорировал LF в строках в кавычках.


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 Numbers отлично справляется с выделением сложного многострочного 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 04
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.