Я получаю 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-данные, содержащие запятые в нем?
Не пытайтесь делать это с регулярным выражением. Просто используйте 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, {separator: ';', delimiter: "'"});
Я создал проект, чтобы обеспечить сквозной синтаксический анализатор CSV, написанный на JavaScript, который выводит догадки из импорта-экспорта CSV.
Выполнение тяжелой работы на клиенте устраняет ненужную нагрузку на сервер и удаляет любые ненужные AJAX-обратные поездки на сервер.
Обновить:
Если вы ищете решение на стороне сервера, библиотека также работает на Node.js.