Работа с запятыми в CSV - PullRequest
16 голосов
/ 30 июня 2011

Я получаю данные 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, содержащие запятые вэто?

Ответы [ 3 ]

30 голосов
/ 30 июня 2011

Не пытайтесь делать это с помощью регулярного выражения.Просто используйте 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 голосов
/ 30 июня 2011

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

?>
0 голосов
/ 30 апреля 2012

Для JavaScript используйте jQuery-CSV

Если вы уже используете jQuery, просто добавьте модуль jquery-csv.js, чтобы предоставить методы расширения.Затем просто конвертируйте CSV напрямую в массив JavaScript.

Если вы выполняете только синтаксический анализ, приведите его к одномерному массиву:

$.csv.toArray(csv);

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

$.csv.toArrays(csv);

Примечание: все различные окончания строк обнаруживаются и разделяютсяправильно с использованием интеллектуального регулярного выражения.

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

Пример:

$. Csv.toArray (csv, {separator: ';', разделитель: "'"});

Я создал проект для обеспечения сквозного синтаксического анализатора CSV, написанного на JavaScript, который избавляет от догадок при импорте-экспорте CSV.

Выполнение тяжелой работы на клиенте снимает ненужную нагрузку на сервер и удаляет любыененужные обходы AJAX на сервер.

Update:

Если вы ищете решение на стороне сервера, библиотека также работает на Node.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...