Регулярное выражение для анализа CSV в PHP

Мне уже удалось разбить CSV-файл с помощью этого регулярного выражения: «/, (? = (?: [^ \"] \ "[^ \"] \ ") (?! [^ \"] \ ")) /"

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

Насколько я знаю, формат CSV может инкапсулировать строки в двойные кавычки, а все двойные кавычки, которые уже являются частью строки, удваиваются. Например:

Моя «другая» кошка

становится

«Мой» «другой» «кот»

В основном мне нужно регулярное выражение, которое заменит все последовательности N двойных кавычек на последовательность двойных кавычек (N / 2 – округленное).

Или есть лучший способ? Заранее спасибо.

Related of "Регулярное выражение для анализа CSV в PHP"

Существует функция чтения csv-файлов: fgetcsv

Почему вы пытаетесь разделить файл с регулярным выражением, когда есть функция fgetcsv, которая выполняет всю тяжелую работу?

Вы можете передать разделитель и разделитель, и он обнаружит, что делать.

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

Тем не менее, речь шла конкретно об удалении нежелательных кавычек после первоначального раскола. Одно предлагаемое решение (пока) слишком наивно, и оно использует только скрытые кавычки внутри поля, а не фактические разделители. (Я знаю, что ОП не спрашивал об этом, но их нужно удалить, так почему бы не сделать их так же, как другие?) Вот мое решение:

$csv_field = preg_replace('/"(.|$)/', '\1', $csv_field); 

Это регулярное выражение соответствует кавычки, за которой следует любой символ или конец строки, и заменяет сопоставленный символ (ы) вторым символом или пустым строком, если он был сопоставлен с $ . Согласно спецификации, поля CSV могут содержать разделители строк; что, похоже, не так много, но вы можете добавить модификатор 's' в regex, если вам нужно.

 preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $line,-1,PREG_SPLIT_DELIM_CAPTURE); 

Имеет проблемы с «внутри струн типа« Игрушки »R« Нас »

Поэтому вы должны использовать вместо этого:

 preg_split('/'.$seperator.'(?=(?:[^\"])*(?![^\"]))/', $line,-1, PREG_SPLIT_DELIM_CAPTURE); 

Для тех из вас, кто не будет использовать регулярное выражение вместо fgetcsv. Ниже приведен полный пример создания таблицы html из csv с использованием регулярного выражения.

  $data = file_get_contents('test.csv'); $pieces = explode("\n", $data); $html .= "<table border='1'>\n"; foreach (array_filter($pieces) as $line) { $html .= "<tr>\n"; $keywords = preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $line,-1,PREG_SPLIT_DELIM_CAPTURE); foreach ($keywords as $col) { $html .= "<td>".trim($col, '"')."</td>\n"; } $html .= "</tr>\n"; } $html .= "</table>\n"; 

Вот моя быстрая попытка, хотя это будет работать только на границах слов.

 preg_replace('/([\W]){2}\b/', '\1', $csv)