使用php逐行解析csv文件

时间:2011-11-30 02:17:10

标签: php csv

我有一个包含数据的csv文件 第1行是这样的标题

 id fname lname email date code pid

然后每行都有每个字段名称下面的数据

3232456454  mike    strong  mike@mike.com   11/8/11 0:00    AU  2540

当我使用文本编辑器看到这个csv时,我看到如下。

3232456454,mike,strong,mike@mike.com,11/8/11 0:00,AU,2540
87876548788,bob,cool,bob@what.com,11/8/11 0:00,RY,2148
23498765,nike,tick,nike@google.com,11/8/11 0:00,TE,5240

现在我想用php读取文件,我希望数据格式与文本文件完全相同。我会将这些数据用于其他目的。我不想用逗号分割,所以我不能使用fgetcsv。我尝试使用php文件()打开它,但当我循环它,我没有看到正确的数据。有人可以提出一些建议吗?

如果我这样做,它会打印在数组中,每个元素都取一个值,我不想要这个......

    $csv = array();
    $lines = file('sample.csv', FILE_IGNORE_NEW_LINES);

    foreach ($lines as $key => $value)
    {
        $csv[$key] = str_getcsv($value);
    } 
print_r($csv)

我尝试使用谷歌代码中的parsecsv库,但这并不是必需的,因为我想逐行扫描数据。

我需要忽略输出中的第一行(标题)。

如果我能得到这样的输出,这将解决我的问题

Array
(
    [id,fname,lname,email,,data,code,pid] => 3232456454,mike,strong,mike@mike.com,11/8/11 0:00,AU,2540
)

Array
(
    [id,fname,lname,email,,data,code,pid] => 87876548788,bob,cool,bob@what.com,11/8/11 0:00,RY,2148
)

问候

3 个答案:

答案 0 :(得分:9)

$csv = file_get_contents($file);

这将使文件按原样而不进行任何转换或拆分或任何操作,只需一个长字符串。

如果要将其拆分为每行的数组,只需执行

$csv = file($file, FILE_IGNORE_NEW_LINES);

,没有别的。没有循环,没有getcsv,只有file()


但即使您说您对解析CSV不感兴趣, 处理CSV,所以我会尽快解析它并再次输出,甚至返回CSV如果有必要的话。

$fh = fopen($file, 'r');
$header = fgetcsv($fh);

$data = array();
while ($line = fgetcsv($fh)) {
    $data[] = array_combine($header, $line);
}

fclose($fh);

print_r($data);


// outputting:

$out = fopen('php://output', 'w');
fputcsv($out, array_keys($data[0])); // skip this if you don't want headers
foreach ($data as $line) {
    fputcsv($out, $line);
}
fclose($out);

如果无法正确识别行结尾,请在脚本顶部尝试ini_set('auto_detect_line_endings', true);

点击此处查看演示:http://codepad.viper-7.com/t31IEv

答案 1 :(得分:0)

使用fopen和fgets代替,并使用你所在行的计数器,这样就可以忽略第一行:

$c=0;
$data=fopen($file,'r');
while($row=fgets($data)){
    //$row is your line as a string
    if($c!=0){
    //do something with it
    echo $row."\n";
   }
   $c++;
}

答案 2 :(得分:0)

如果无论你做什么,你只能使用fgets()或fgetcsv()获取CSV文件的最后一行,只需尝试将文件内容复制/粘贴到新文件中,然后尝试使用它。

我指的是@Jay似乎有的问题:似乎如果文件是使用Excel 2011 / Mac创建的,则其结构未正确解释。

有关详细信息,请参阅此处:Which encoding opens CSV files correctly with Excel on both Mac and Windows?