CSV解析返回一个空数组

时间:2013-06-08 07:38:48

标签: php parsing csv

我有一个超级简单的CSV文件(约500行,14.5k),我需要将其放入一个数组中,稍后我将需要检查ID列与其他数据集。

CSV就像这样:

id,mail,Plan
102,,Plan_Pay
1028,,Plan_Pay
1031,,Plan_Prom
1032,,Plan_Pay
1033,,Plan_Pay
1034,xxxxxx@gmail.com,Plan_Free
1035,xxxxxx@gmail.com,Plan_Free
1036,xxxxxx@gmail.com,Plan_Pay
1079,,Plan_Prom
109,,Plan_Pay
1166,xxxxxx@elid.com,Plan_Prom
12,xxxxxx@gmail.com,Plan_Pay
....
....
(on and on .. about 500 lines)

但无论如何我试着解析它,我得到一个空数组。

我尝试使用parsecsv lib

$csvf =  'id2.csv';

echo $csvf; // debug verify that path exists
$csv = new parseCSV();
$csv->auto($csvf);
print_r($csv->data);// results empty

以及变体

$csv = new parseCSV('id2.csv');
print_r($csv->data);// results empty

我也试过(来自php.net):

  if ( !function_exists('fgetcsv') ) echo 'Server too old ... we need to check.';// but it is ok

    function csv_to_array($filename, $delimiter=',')
    {
        if(!file_exists($filename) || !is_readable($filename)){
         $data = array();
        $data[] = 'no file'; // debug -verify there is file..
        // echo 'no file'; // debug -verify there is file..
        // return FALSE;
    }
        $header = NULL;
        $data = array();
        if (($handle = fopen($filename, 'r')) !== FALSE)
        {
            while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
            {
                if(!$header)
                    $header = $row;
                else
                    $data[] = array_combine($header, $row);
            }
            fclose($handle);
        }
        return $data;
    }

    $csv = csv_to_array($csvf);
    echo $csvf; // debug verify correct path
    print_r($csv);// results empty

我尝试了所有路径组合,相对("id2.csv"),绝对("http://path.to/id2.csv")等等,但结果都相同。

我的问题是:文件本身有问题吗? * .CSV是这么简单的格式,我有一个非常小的文件(大约500行)。 它可能是编码问题(没有bom是UTF-8)。或者服务器问题?或者我只是做错了? (到现在为止,任何地方都没有明显的错误)

1 个答案:

答案 0 :(得分:1)

From PHP DOC

  

注意:如果在Macintosh计算机上读取文件或由Macintosh计算机创建文件时PHP无法正确识别行结尾,则启用 auto_detect_line_endings 运行时配置选项可能有助于解决问题。

如果您已设置auto_detect_line_endings这是一种更简单的方法来阅读csv

$csv = new SplFileObject("id2.csv", "r");
$csv->setFlags(SplFileObject::READ_CSV);
foreach($csv as $row) {
    list($id,$mail,$plan) = $row;
    // You your stuff
}