Работа с запятыми в CSV
Я получаю CSV-данные из SOAP-вызова в php. К сожалению, данные могут содержать запятые. Он отформатирован правильно, как в
1, name, 2, lariat, 3, "first, last", 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-данные, содержащие запятые в нем?
Ответы
Ответ 1
Не пытайтесь делать это с помощью регулярного выражения. Просто используйте 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
)
Ответ 2
Еще один способ преобразования 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'));
?>
Ответ 3
Для использования JavaScript jQuery-CSV
Если вы уже используете jQuery, просто добавьте модуль jquery-csv.js, чтобы разоблачить методы расширения. Затем просто преобразуйте CSV непосредственно в массив JavaScript.
Если вы только разбираете, следующее преобразует его в одномерный массив:
$.csv.toArray(csv);
Если у вас многострочная строка CSV, следующее преобразует ее в двумерный массив:
$.csv.toArrays(csv);
Примечание: все разные окончания строк обнаруживаются и расщепляются правильно с помощью интеллектуального регулярного выражения.
По умолчанию разделитель представляет собой двойную кавычку ("), а разделитель по умолчанию - это запятая (,), но вы можете изменить пользовательские настройки, указав их в вызове метода.
Пример:
$. csv.toArray(csv, { разделитель:';', Разделитель: "'" });
Я создал проект, чтобы обеспечить сквозной синтаксический анализатор CSV, написанный на JavaScript, который берет догадки из импорта-экспорта CSV.
Выполнение тяжелой работы на клиенте устраняет ненужную нагрузку на сервер и удаляет любые ненужные AJAX-обратные поездки на сервер.
Update:
Если вы ищете серверное решение, библиотека также работает с Node.js.