1

健全性チェックを試みているかなり大きな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'

したがって、エスケープされていない改行などは含まないでください。誰かが何が間違っている可能性があるか考えていますか?

4

1 に答える 1

4

CSVレコードは複数行にまたがることができます。いずれかの値にキャリッジリターンがある場合、ファイルには複数(2つ以上)の物理行がありますが(でカウントwc)、を使用して1つのCSVレコードとして読み取られfgetcsvます。

また、ファイルの終わりでFALSEが返されるためfeof($f)、をチェックする必要はありません。fgetcsv

于 2012-06-11T14:35:52.160 に答える