【问题标题】:Dealing with commas in CSV处理 CSV 中的逗号
【发布时间】:2011-09-26 01:57:00
【问题描述】:

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

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 数据有什么建议吗?

【问题讨论】:

    标签: php javascript regex soap 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
    )
    

    【讨论】:

    • 请注意,str_getcsv 直到 PHP 5.3 才可用。在此之前使用 fgetcsv。如果您没有直接从文件或其他流中获取内容,那么您可能必须先将其强制放入流(php://memory,写入然后位置重置)或文件中。
    【解决方案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'));
    
    ?>
    

    【讨论】:

    • @Phoenix - 这部分处理数据和报价中的逗号?我错过了什么吗?
    【解决方案3】:

    对于 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。

    【讨论】:

    • 谢谢。我想我会为客户端 csv 处理选择这样的东西,但我的应用程序是基于服务器端的,我必须查询一些提供 csv 输出的非关系数据库。
    • 对不起。我想我忘记了这个问题:-(。毕竟我已经在将近一年前发布了它并且该项目已经关闭。感谢您指出 jQuery 替代方案。如果我需要,我将留在我的脑海中再来一次:-)
    • @LordLoh。如果您需要服务器端解决方案,我刚刚确认该插件也适用于 Node.js。有关如何导入 Node.js 脚本的详细信息,请参见项目页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2018-11-26
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多