Работа с запятыми в CSV
Я получаю данные CSV из вызова SOAP в php. К сожалению, в данных могут быть запятые. Он отформатирован правильно, как в
1, имя, 2, лариат, 3, "первый, последний", 5, NMEA,...
Мне нужно разобрать его на отдельные значения в php или javascript. Я просмотрел потоки по переполнению стека и в других местах, но не нашел конкретного решения в php/javascript.
В настоящее время я использую подход
$subject = '123,name,456,lryyrt,123213,"first,last",8585,namea3';
$pattern = '/,|,"/';
$t2=preg_replace ('/,|(".*")/','$0*',$subject);
$t2=str_replace(',','*',$t2);
$t2=str_replace('*',',',$t2);
Где * - разделитель, но preg_replace
генерирует дополнительный *. Я попробовал несколько других подходов, включающих preg_match
и другие функции preg_
, но мне не удалось добиться какого-либо чистого разделения.
Есть какие-либо предложения о том, как разделить CSV-данные, содержащие в них запятые?
3 answers
Не пытайтесь сделать это с помощью регулярного выражения. Просто используйте str_getcsv()
! Третий параметр информирует str_getcsv()
о необходимости поиска полей, заключенных в кавычки.
$subject = '123,name,456,lryyrt,123213,"first,last",8585,namea3';
$array = str_getcsv($subject, ",", '"');
print_r($array);
// Prints:
Array
(
[0] => 123
[1] => name
[2] => 456
[3] => lryyrt
[4] => 123213
[5] => first,last
[6] => 8585
[7] => namea3
)
Просто еще один способ преобразования csv-файла в ассоциативный массив.
<?php
//
// Convert csv file to associative array:
//
function csv_to_array($input, $delimiter=',')
{
$header = null;
$data = array();
$csvData = str_getcsv($input, "\n");
foreach($csvData as $csvLine){
if(is_null($header)) $header = explode($delimiter, $csvLine);
else{
$items = explode($delimiter, $csvLine);
for($n = 0, $m = count($header); $n < $m; $n++){
$prepareData[$header[$n]] = $items[$n];
}
$data[] = $prepareData;
}
}
return $data;
}
//-----------------------------------
//
//Usage:
$csvArr = csv_to_array(file_get_contents('test.csv'));
?>
Для JavaScript используйте jQuery-CSV
Если вы уже используете jQuery, просто добавьте jquery-csv.js модуль для предоставления методов расширения. Затем просто преобразуйте CSV непосредственно в массив JavaScript.
Если вы только анализируете, следующее преобразует его в одномерный массив:
$.csv.toArray(csv);
Если у вас есть многострочная строка CSV, следующая строка преобразует ее в двумерный массив:
$.csv.toArrays(csv);
Примечание: все различные окончания строк определяются и правильно разделяются с помощью интеллектуального регулярного выражения.
Разделителем по умолчанию является двойная кавычка ("), а разделителем по умолчанию является запятая (,), но вы можете изменить пользовательские настройки, указав их в вызове метода.
Бывший:
$.csv.toArray(csv, { разделитель:';', разделитель:"'" });
Я создал проект, чтобы предоставить сквозной синтаксический анализатор CSV, написанный на JavaScript, который выводит догадки из импорт-экспорт CSV.
Выполнение тяжелой работы на клиенте устраняет ненужную нагрузку на сервер и устраняет любые ненужные обходы AJAX на сервер.
Обновление:
Если вы ищете серверное решение, библиотека также работает на Node.js.