处理 CSV 中的逗号

2022-08-30 22:03:25

我从php中的SOAP调用中获取CSV数据。不幸的是,数据中可能包含逗号。它的格式正确,如

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_replacepreg_matchpreg_

关于如何拆分包含逗号的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'));

?>