7

PHP を使用して、各行の配列を生成する fgetcsv() を使用して CSV ファイルからデータをインポートしています。最初は、次のように文字数制限を 1024 に設定しました。

while ($data = fgetcsv($fp, 1024)) {
  // do stuff with the row
}

ただし、200 列以上の CSV は、多くの行で 1024 の制限を超えました。これにより、行の読み取りが行の途中で停止し、次に fgetcsv() への呼び出しが前の呼び出しが中断されたところから開始され、EOL に達するまで続きました。

その後、この制限を 4096 に引き上げました。これにより、ほとんどの場合に対処できるはずですが、各行がフェッチされた後に行全体が読み取られたことを確認するようにチェックインしたいと思います。どうすればいいですか?

行末文字 (\n、\r、\r\n) の配列の最後の要素の末尾をチェックすることを考えていましたが、これらは fgetcsv() 呼び出しによって解析されませんか?

4

5 に答える 5

10

length パラメータを省略します。PHP5 ではオプションです。

while ($data = fgetcsv($fp)) {
  // do stuff with the row
}
于 2012-05-24T22:14:35.377 に答える
3

制限を指定しないと、fgetcsv() は行全体をキャプチャするのに必要なだけ丸呑みします。制限を指定する場合、ファイル ストリームをスキャンし、途中で何かをスライスしていないことを確認するのは完全にあなた次第です。

ただし、そもそもこの .csv の生成を制御できない場合、制限を指定しないと危険になる可能性があることに注意してください。1 行に数テラバイトのデータが含まれる悪意のある CSV でサーバーを圧倒するのは簡単です。

于 2012-05-24T22:15:03.063 に答える
0

提案していただきありがとうございますが、これらのソリューションは、制限を提供しながら最長の行を説明しているという問題を実際には解決しませんでした. wc -LUNIX コマンド viashell_exec()を使用して、行の取得を開始する前にファイル内の最長の行を特定することで、これを実現できました。コードは以下のとおりです。

// open the CSV file to read lines
$fp = fopen($sListFullPath, 'r');

// use wc to figure out the longest line in the file
$longestArray = explode(" ", shell_exec('wc -L ' . $sListFullPath));
$longest_line = (int)$longestArray[0] + 4; // add a little padding for EOL chars

// check against a user-defined maximum length
if ($longest_line > $line_length_max) {
    // alert user that the length of at least one line in the CSV is too long
}

// read in the data
while ($data = fgetcsv($fp, $longest_line)) {
    // do stuff with the row
}

このアプローチにより、すべての行が完全に読み取られることが保証され、PHP を使用してファイル全体を 1 行ずつ処理することなく、非常に長い行のセーフティ ネットが提供されます。

于 2012-06-01T16:44:47.657 に答える