用CSV处理逗号

时间:2011-06-30 15:02:21

标签: php javascript regex soap csv

我从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_replace生成额外的*。我尝试了其他几种涉及preg_match和其他preg_函数的方法,但没有成功进行任何类型的清除拆分。

有关如何拆分包含逗号的CSV数据的任何建议吗?

3 个答案:

答案 0 :(得分:30)

请勿尝试使用正则表达式执行此操作。只需使用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
)

答案 1 :(得分: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'));

?>

答案 2 :(得分:0)

对于JavaScript使用jQuery-CSV

如果您已经在使用jQuery,只需添加jquery-csv.js模块即可公开扩展方法。然后只需将CSV直接转换为JavaScript数组。

如果您只解析以下内容会将其转换为一维数组:

$.csv.toArray(csv);

如果您有多行CSV字符串,则以下内容会将其转换为二维数组:

$.csv.toArrays(csv);

注意:使用智能正则表达式检测并正确分割所有不同的行结尾。

默认分隔符是双引号(“),默认分隔符是逗号(,),但您可以通过在方法调用中指定它们来更改使用自定义设置。

<强>实施例

$。csv.toArray(csv,{      分隔器:';',      分隔符:“'”    });

我创建了一个项目来提供一个用JavaScript编写的端到端CSV解析器,它可以避免导入导出CSV的猜测。

在客户端上执行繁重操作会消除服务器上不必要的负载,并删除任何不必要的AJAX往返服务器。

<强>更新

如果您正在寻找服务器端解决方案,该库也适用于Node.js。