Импорт CSV с переносами строк в Excel 2007 - PullRequest
103 голосов
/ 19 апреля 2010

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

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

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

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

ТИА
-J

EDIT:
Вот быстрый файл, который я написал вручную, чтобы продублировать проблему.

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

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

Ответы [ 21 ]

44 голосов
/ 20 марта 2014

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

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

29 голосов
/ 17 сентября 2013

Ни одно из предложенных решений не сработало для меня.

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

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

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

24 голосов
/ 22 июня 2010

Я наконец нашел проблему!

Оказывается, мы писали файл с использованием кодировки Unicode, а не ASCII или UTF-8. Изменение кодировки в FileStream, похоже, решает проблему.

Спасибо всем за все ваши предложения!

23 голосов
/ 12 марта 2015

Если вы делаете это вручную, загрузите 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. Необходимо дважды щелкнуть файл, чтобы открыть его, импорт данных из текста не работает.

Надеюсь, это кому-нибудь поможет.

6 голосов
/ 26 мая 2014

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

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

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

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

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

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

5 голосов
/ 24 апреля 2010

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

Поврежденная:
Имя, должность, описание
«Джон», «Мистер», «Мое подробное описание»

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

4 голосов
/ 11 сентября 2015

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

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

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

* Э.Г. 1014 * «Тест», «Многострочный элемент \ n многострочный элемент "\ r \ n "Test2", "Многострочный элемент \ n многострочный элемент "\ r \ n

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

2 голосов
/ 03 декабря 2015

Если кто-то наткнулся на эту ветку и ищет точный ответ, он идет сюда (кредит человеку, упоминающему LibreOffice:

1) Установить LibreOffice 2) Откройте Calc и импортируйте файл 3) В моем текстовом файле поля разделены, а символьные поля заключены в " 4) сохранить как файл ODS 5) Открыть файл ODS в Excel 6) Сохранить как .xls (x) 7) Готово. 8) Это отлично сработало и спасло меня БОЛЬШОЙ!

2 голосов
/ 04 ноября 2015

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

  • разделитель вашего импортированного CSV должен соответствовать разделителю списка ваших региональных настроек (в моем случае)
  • Вы должны дважды щелкнуть файл в проводнике. не открывайте его из Excel
2 голосов
/ 19 июня 2015

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

...