我有一个相当大的csv文件(17GB),我正在尝试进行健全性检查。我写了一个看起来像这样的小脚本:
#!/usr/bin/php
<?php
$f = fopen($argv[1],'r');
$i=0;
while (!feof($f)) {
$row = fgetcsv($f);
$i++;
}
print $i."\n";
?>
应该只读取行数并将其打印出来。此脚本输出: 60770881
但如果我做了wc -l
,结果就是60777200。
我的csv文件是使用以下命令从MySQL生成的:
INTO OUTFILE '/tmp/file.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n'
所以它不应该有任何未转义的换行符或类似的东西。有谁知道可能出现什么问题?
答案 0 :(得分:3)
CSV记录可以跨越多行。如果您在任何值中有回车符,则文件中将有多个(2个或更多)物理行(由wc
计算),但它们将使用{{1}作为一个CSV记录读取}。
此外,您无需检查fgetcsv
,因为feof($f)
将在文件末尾返回FALSE。