Мне уже удалось разбить CSV-файл с помощью этого регулярного выражения: «/, (? = (?: [^ \"] \ "[^ \"] \ ") (?! [^ \"] \ ")) /"
Но я закончил с массивом строк, которые содержат открывающиеся и заканчивающиеся двойные кавычки. Теперь мне нужно регулярное выражение, которое будет разделять эти строки двойных кавычек разделителя.
Насколько я знаю, формат CSV может инкапсулировать строки в двойные кавычки, а все двойные кавычки, которые уже являются частью строки, удваиваются. Например:
Моя «другая» кошка
становится
«Мой» «другой» «кот»
В основном мне нужно регулярное выражение, которое заменит все последовательности N двойных кавычек на последовательность двойных кавычек (N / 2 – округленное).
Или есть лучший способ? Заранее спасибо.
Существует функция чтения 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)