2011-06-30 83 views
16

我从php中的SOAP调用中获取CSV数据。不幸的是,这些数据可能含有逗号。这是正确的格式为处理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); 

其中*是deliminator,但preg_replace产生一个额外的*。我尝试了一些其他方法,包括preg_match和其他preg_函数,但没有成功进行任何形式的清理分割。

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

回答

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 
) 
+3

要注意,str_getcsv在PHP 5.3之前不可用。在此之前,fgetcsv被使用。如果您没有直接从文件或其他流中获取内容,则可能必须先将其强制为流(php:// memory,然后写入位置重置)或文件。 – Zimzat

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')); 

?> 
+0

@Phoenix - 这部分涉及数据和报价中的逗号?我错过了什么吗? –

0

对于JavaScript如果您已经使用jQuery,只需添加jQuery的csv.js模组,露出扩展方法使用jQuery-CSV

。然后只需将CSV直接转换为JavaScript数组。

如果你只解析下面将其转换为一维数组:

$.csv.toArray(csv); 

如果你有一个多行的CSV字符串,下面将其转换为一个双二维数组:

$.csv.toArrays(csv); 

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

缺省的分隔符是一个双引号(“),默认的分隔符是逗号(,),但你可以通过在方法调用中指定他们改变使用自定义设置

例:

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

我创建的项目提供用JavaScript编写的终端到终端的CSV解析器这需要猜测rk退出导入导出CSV。

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

更新:

如果你正在寻找一个服务器端解决方案,图书馆也适用于Node.js的

+0

谢谢。我想我会选择类似于客户端csv处理的东西,但我的应用程序基于服务器端,我不得不查询一些给出csv输出的非关系数据库。 –

+0

对不起。我想我已经忘记了这个问题:-(。我已经在大约一年前发布了它,并且该项目已经关闭。感谢您指出了jQuery替代品。我应该留在我的脑海中,如果我需要它再次:-) –

+0

@LordLoh。如果您需要服务器端解决方案,我只是确认该插件也适用于Node.js。有关如何导入Node.js脚本的详细信息可以在项目页面中找到。 –