Подтвердить что ты не робот

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

4b9b3361

Ответ 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.