我从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数据的任何建议吗?
答案 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。