【问题标题】:parse csv file using php line by line使用php逐行解析csv文件
【发布时间】:2011-11-30 02:17:09
【问题描述】:

我有一个包含数据的 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 file() 打开它,但是当我循环它时,我看不到正确的数据。有人可以提出一些建议吗?

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

    $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
)

问候

【问题讨论】:

  • “看不到正确的数据”是什么意思?你看到了什么做什么,你到底期待什么?
  • 嗨,我认为它是这样的数组格式 Array ( [0] => 3232456454 [1] => mike [2] => strong [3] => mike@mike.com [4 ] => 11/8/11 0:00 [5] => 澳大利亚 [6] => 2540 87876548788 [8] => bob [9] => 酷 [10] => bob@what.com [11] = > 11/7/11 0:00 [12] => RY [13] => 2148 23498765
  • 对不起,我不知道如何格式化上述数据..所以如果你看到,在第 6 个元素之后,它需要下一条记录的 id。我想要它,就像我在文本文件中看到的那样。
  • 那么,你想要它作为一个数组还是仅仅作为一行文本?
  • 文本行,与此处完全相同 3232456454,mike,strong,mike@mike.com,11/8/11 0:00,AU,2540 这样我就可以逐行获取我达到了第 50 条记录之类的东西,我会做一些其他的事情......我可以计算并处理一旦我逐行获取数据。另外,我怎样才能跳过第一行..?

标签: php csv


【解决方案1】:
$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

【讨论】:

  • 我做了这个 $file = "smple.csv"; $csv = file_get_contents($file);回声 $csv;只打印最后一行..你应该我不必循环,对吧?
  • @Jay file_get_contents 一次获取整个文件,它应该输出的不仅仅是最后一行。
  • 我也是这么想的,我只是做了上面粘贴的操作,但我只看到最后一行..我在 mac 上不确定这是否是我创建 csv 文件时的问题。
【解决方案2】:

改用 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++;
}

【讨论】:

  • 您的打印线在哪里?如果它在if 内(在此期间),那么它应该每次都触发
【解决方案3】:

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

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

更多信息请参见:Which encoding opens CSV files correctly with Excel on both Mac and Windows?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多