Php экранирование кавычек csv

как удалить кавычки из csv в php

У меня есть массив, который я получаю из БД. В этом проекте я конвертирую свой массив в файл csv. Но каждый раз, когда я открываю файл, я получаю двойные кавычки. Я пробовал с str_replace и preg_place безуспешно. Как удалить цитаты

$query = "SELECT t.transactiontime, t.restaurant_id, t.transactionid, t.cardid, emd.m_field_id_2, t.pricebefordiscount, t.menucard_cut from transactions as t left join exp_member_data AS emd ON (t.cardid-10000000 = emd.member_id) order by t.transactiontime desc limit 50"; $transactions_query = ee()->db->query($query); $transactions_result = $transactions_query->result_array(); $transaction_array = array(); foreach ($transactions_result as $key) < $date = new DateTime($key['transactiontime']); $newdate = $date->format('d.m.Y'); $transaction_array[] = array( 'transactiontime' => $newdate, 'restaurant_id' => $key['restaurant_id'], 'member' => $key['transactionid'] . " " . $key['m_field_id_2'], 'pricebefordiscount' => $key['pricebefordiscount']/100, 'menucard_cut' => $key['menucard_cut'] ); > function outputCSV($data) < $outstream = fopen("php://output", 'w'); function __outputCSV(&$vals, $key, $filehandler) < fputcsv($filehandler, $vals, ';'); >array_walk($data, '__outputCSV', $outstream); fclose($outstream); > outputCSV($transaction_array); 
19.08.2013;47657;"12459 Abdullahi";60; 19.08.2013;47658;"12455 atima";30; 

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

Я предполагаю, что они добавляются fputcsv; в этом случае вам нужно будет написать свои собственные функции для вывода CSV.

^ чтобы завершить этот комментарий, посмотрите здесь, как писать в свой собственный файл. Это довольно просто: php.net/manual/en/function.fwrite.php

4 ответа

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

data "some more" another thing //is not the same as: data some more another thing 

Однако, если вы хотите удалить их, примените это регулярное выражение к каждой строке:

Читайте также:  Height and overflow css

И все должно быть в порядке.
Как это работает:

  • (^|;) соответствует (и захватывает) либо начало строки, либо точку с запятой
  • » соответствует литералу » (не захватывает)
  • ([^» ]+) : соответствует и захватывает хотя бы один символ, который не «
  • «; : соответствует (без захвата) литералу » и ;
  • $1$2; : $1 — это обратная ссылка на первую совпавшую группу ( (^|;) )
    $2 отсылает к ([^»;]+) , ; — это просто литерал

Предположим, что $line равно ‘19.08.2013;47657;»12459 Abdullahi»;60;’ , результат (после вызова preg_replace ) будет: ‘19.08.2013;47657;12459 Abdullahi;60;’ . Цитаты пропали.

Однако, если какое-то поле будет содержать символ » , оно, вероятно, будет экранировано ( \» ), поэтому, чтобы регулярное выражение не могло его обнаружить, вот одно, которое использует утверждение просмотра вперед:

При представлении такой строки, как ‘19.08.2013;47657;»12459 \»Abdullahi\»»;60;’ , последнее выражение вернет 19.08.2013;47657;12459 \»Abdullahi\»;60; 2

@Zaz: нигде в вашем коде, только что заметил, что вы используете fputcsv . Эта функция, вероятно, добавляет кавычки. поэтому либо используйте fwrite($handle, implode(‘;’,$array)); , либо напишите свою собственную функцию создания csv. Если кавычки все еще там, примените это preg_replace к каждой строке, когда вы вызываете fwrite

Обычно существует очень веская причина, по которой значения ячеек заключаются в кавычки в CSV. Обычно это происходит потому, что существует опасность / опасение, что значение ячейки содержит маркер разделения значений столбца. Их удаление может нанести ущерб при синтаксическом анализе CSV.

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

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

$delimiter = ','; $enclosure = '"'; $row = preg_replace("/(?:(?))|(?:(?=$|))/",'',$row); 

Если ваш символ-разделитель — вертикальная черта, убедитесь, что вы поставили перед ним два символа обратной косой черты ( \\| ).

Источник

Оберните значения CSV, сгенерированные PHP fputcsv (), в «»

Итак, мой код генерирует CSV файл, используя встроенную функцию fputcsv . Для разделителя я использую ‘,’ (запятая).
Для оболочки я использую ‘»‘ (двойная кавычка). Однако, когда я пытаюсь что-то вроде

fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"'); 
a,b,"long string, with commas",, 
"a","b","long string, with commas","","" 

@Ignacio, Эндрю: По-видимому, скрытый в небольшом углу диалогового окна импорта в программном обеспечении для работы с электронными таблицами — это возможность сжать несколько пустых полей ( a. => a, ) и / или удалить их ( a. => a ). И, очевидно, некоторые пользователи проверяют это и не знают об этом, поэтому простое, универсальное для всех решение — заставить каждое пустое поле быть пустой строкой ( a,»»,»»,»» ).

5 ответов

Обычно это не проблема для файлов CSV.

fputcsv ставит кавычки вокруг значения, если он будет неоднозначным. Например,

a,b,"long string, with commas",, 

не является двусмысленным, но

a,b,long string, with commas,, 

есть и будет в большинстве случаев (чтение: все) интерпретироваться читателем CSV как имеющее более 5 полей.

Анализаторы CSV будут принимать строковые литералы даже без кавычек вокруг них.

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

Вы хотите поместить это в цикл для всех своих строк.

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

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

Я работал над этим, вставив некоторые фиктивные строковые символы с пробелом # @@#, а затем удалив их. Вот пример реализации:

//$exported is our array of data to export $filename = 'myfile.csv'; $fp = fopen($filename, 'w'); foreach ($exported as $line => $row) < if ($line >0) < foreach ($row as $key =>$value) < $row[$key] = $value."#@ @#"; >> fputcsv($fp, $row); > fclose($fp); $contents = file_get_contents($filename); $contents = str_replace("#@ @#", "", $contents); file_put_contents($filename, $contents); 

Это включает все поля в двойных кавычках, включая пустые

Я думаю, что решение будет таким,

$order_header_arr = array("Item1", "Item2","This is Item3"); fputcsv($fp, $order_header_arr,',',' '); 

запомнить » » [Пробел] Между третьим параметром fputcsv

fputcsv не будет включать все переменные массива в кавычки. Наличие числового значения массива без кавычек может быть правильным, но представляет собой проблему, когда ярлык или адресная программа сталкивается с числовым индексом почтового индекса США, потому что при печати он будет лишать начальные нули. Таким образом, 05123-0019 становится 5123-19.

Чтобы заключить все значения, независимо от того, существуют они или нет, в кавычках я читаю входной файл с помощью fgetsrc и записываю исправленную версию с использованием fwrite. fgetsrc считывает запись в переменные массива. Поскольку fwrite записывает переменную, вы должны вывести переменные массива, заключить их в кавычки и разделить переменную массива запятой. Затем добавьте разделитель записи.

 $arc .= "\n"; //add end of record to variable $arc fwrite($file_out, $arc) or die ("ERROR: Cannot write the file"); //write the record using variable $arc > > echo "end of job"; fclose($file_in); fclose($file_out); ?> 

Источник

как убрать кавычки из csv в php

У меня есть массив, который я получаю из БД. В этом проекте я конвертирую свой массив в CSV-файл. Но каждый раз, когда я открываю файл, я получаю двойные кавычки. Я пробовал использовать str_replace и preg_place, но безуспешно. Как убрать кавычки это мой CSV-код

$query = "SELECT t.transactiontime, t.restaurant_id, t.transactionid, t.cardid, emd.m_field_id_2, t.pricebefordiscount, t.menucard_cut from transactions as t left join exp_member_data AS emd ON (t.cardid-10000000 = emd.member_id) order by t.transactiontime desc limit 50"; $transactions_query = ee()->db->query($query); $transactions_result = $transactions_query->result_array(); $transaction_array = array(); foreach ($transactions_result as $key) < $date = new DateTime($key['transactiontime']); $newdate = $date->format('d.m.Y'); $transaction_array[] = array( 'transactiontime' => $newdate, 'restaurant_id' => $key['restaurant_id'], 'member' => $key['transactionid'] . " " . $key['m_field_id_2'], 'pricebefordiscount' => $key['pricebefordiscount']/100, 'menucard_cut' => $key['menucard_cut'] ); > function outputCSV($data) < $outstream = fopen("php://output", 'w'); function __outputCSV(&$vals, $key, $filehandler) < fputcsv($filehandler, $vals, ';'); >array_walk($data, '__outputCSV', $outstream); fclose($outstream); > outputCSV($transaction_array); 
19.08.2013;47657;"12459 Abdullahi";60; 19.08.2013;47658;"12455 atima";30; 

Однако кавычки вокруг полей в CSV-файлах вполне допустимы, и все, кто снова читает файл, должны обрабатывать их правильно. — andrewsi

Я предполагаю, что они добавляются fputcsv; в этом случае вам нужно будет написать свои собственные функции для вывода CSV. — andrewsi

^ чтобы завершить этот комментарий, посмотрите здесь, как писать в свой собственный файл. Это довольно просто: php.net/manual/en/function.fwrite.php — Jurik

4 ответы

На самом деле в цитатах нет ничего плохого. Они позволяют избежать путаницы, которая может возникнуть, когда некоторые CSV используют пробелы в качестве разделителя:

data "some more" another thing //is not the same as: data some more another thing 
  • (^|;) соответствует (и захватывает) либо начало строки, либо точку с запятой
  • » соответствует буквальному » (не захватывает)
  • ([^» ]+) : соответствует и захватывает по крайней мере один символ, который не «
  • «; : соответствует (без захвата) литерала » и ;
  • $1$2; : $1 является обратной ссылкой на первую совпадающую группу ( (^|;) )
    Наблюдения и советы этой статьи мы подготовили на основании опыта команды $2 Рекомендации ([^»;]+) , ; это просто буквально

предполагать $line is ‘19.08.2013;47657;»12459 Abdullahi»;60;’ , результат (после preg_replace вызов) будет: ‘19.08.2013;47657;12459 Abdullahi;60;’ . Котировки исчезли.

Однако, если какое-то поле должно было содержать » char, он, вероятно, будет экранирован ( \» ), поэтому, чтобы регулярное выражение не смогло обнаружить это, здесь используется утверждение с опережением:

При представлении строки типа ‘19.08.2013;47657;»12459 \»Abdullahi\»»;60;’ , последнее выражение вернет 19.08.2013;47657;12459 \»Abdullahi\»;60;

Источник

Оцените статью