Импортирование CSV, у которого есть разрывы строк в фактических полях - PullRequest
10 голосов
/ 29 марта 2011

Я использую PHP для импорта файла CSV, который исходит из электронной таблицы Excel. Некоторые поля содержат разрывы строк, поэтому при повторном открытии таблицы CSV в таблице Excel / Open Office неверно интерпретируется, где должны произойти разрывы строк.

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

Я мог бы очистить данные вручную, но а) это заняло бы целую вечность в виде файла из 10 тыс. Строк, и б) данные были экспортированы из клиентского программного обеспечения

Есть идеи, как автоматически решить эту проблему в процессе импорта? Я бы подумал, что разделив поля, можно было бы отсортировать его, но это не так.

Ответы [ 6 ]

15 голосов
/ 22 ноября 2011

Принятый ответ не решил проблему для меня, но в конечном итоге я нашел эту библиотеку синтаксического анализатора CSV в коде Google, которая хорошо работает для многострочных полей в CSV.

parsecsv-для-PHP:
https://github.com/parsecsv/parsecsv-for-php


Для исторических целей оригинальный проект дома был:
http://code.google.com/p/parsecsv-for-php/

3 голосов
/ 29 марта 2011

У меня тоже была эта проблема, и я не нашел способа правильно прочитать данные.

В моем случае это был однократный импорт, поэтому я сделал скрипт, который искал все разрывы строквнутри столбца и заменил его чем-то вроде #####.Затем я импортировал данные и заменил их на разрывы строк.

Если вам нужен регулярный импорт, вы можете написать собственный CSV-Parser, который решит проблему.Если текстовые столбцы находятся в пределах "", вы можете рассматривать все, что находится между двумя "", как один столбец (с проверкой на наличие экранированного " в содержимом).

1 голос
/ 27 июня 2012

Мое решение следующее:

nl2br(string);

http://php.net/manual/en/function.nl2br.php

Как только вы достигнете уровня отдельной ячейки (строки), запустите его на строке, и он преобразует переносы строкв HTML разрывы для вас.

0 голосов
/ 20 октября 2016

Это старый поток, но я столкнулся с этой проблемой, и я решил ее с помощью регулярного выражения, чтобы вы могли избежать библиотеки только для этого. Здесь код написан на PHP, но его можно адаптировать к другому языку.

$parsedCSV = preg_replace('/(,|\n|^)"(?:([^\n"]*)\n([^\n"]*))*"/', '$1"$2 $3"', $parsedCSV);

Это решение предполагает, что поля, содержащие разрыв строки, заключены в двойные кавычки, что, по-видимому, является допустимым предположением, по крайней мере для того, что я видел до сих пор. Кроме того, двойные кавычки должны следовать за , или помещаться в начале новой строки (или первой строки).

Пример:

field1,"field2-part1\nfield2-part2",field3

Здесь \ n заменяется пробелом, поэтому результат будет:

field1,"field2-part1 field2-part2",field3

Регулярное выражение также должно обрабатывать несколько разрывов строк.

Это может быть неэффективно, если содержимое слишком велико, но может помочь во многих случаях, и идею можно использовать повторно, возможно, оптимизировать, выполняя это для небольших кусков (но вам придется обрабатывать сокращения с исправлением размер буферизован).

0 голосов
/ 22 сентября 2015

Хотя это старый вопрос, ответ может быть все еще актуален для госзакупок. В настоящее время существует новая библиотека (не зависящая от фреймворка) http://csv.thephpleague.com/, которая поддерживает символы NL в полях, а также некоторую фильтрацию.

0 голосов
/ 29 марта 2011

Да, вам нужно найти эту запятую и заменить ее некоторыми специальными символами, такими как комбинация {()}, и, наконец, заменить их на ,, который вы изначально искали.

Надеюсь, что вам это поможет.

...