Работа с запятыми в 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-данные, содержащие в них запятые?

Author: Lord Loh., 2011-06-30

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
)
 30
Author: Michael Berkowski, 2012-08-24 00:59:13

Просто еще один способ преобразования 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'));

?>
 2
Author: Pheonix, 2011-06-30 15:08:12

Для 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.

 0
Author: Evan Plaice, 2012-10-03 23:52:04