18

大きなファイルを1行ずつ解析するスクリプトがあります。処理できないエラーが発生すると停止し、最後に解析された行を通知します。

これは、ファイル内の特定の行を探すための本当に最良の/唯一の方法ですか?(fseek()私の場合は使用できません。)

<?php

for ($i = 0; $i < 100000; $i++)
    fgets($fp); // just discard this

私はこれを使用するのに問題はありません、それは十分に速いです-それは少し汚れているように感じるだけです。基礎となるコードについて私が知っていることから、これを行うためのより良い方法があるとは思いません。

4

5 に答える 5

37

ファイル内の特定の行をシークする簡単な方法は、行番号 ( ) またはバイト オフセット ( )SplFileObjectへのシークをサポートするクラスを使用することです。seek()fseek()

$file = new SplFileObject('myfile.txt');
$file->seek(9999);     // Seek to line no. 10,000
echo $file->current(); // Print contents of that line

バックグラウンドでseek()は、PHP コードが行ったことを実行します (C コードを除く)。

于 2011-09-30T21:32:17.723 に答える
4

行番号しかない場合は、他に行を見つける方法はありません。ファイルは行ベース(または文字ベース)ではないため、ファイル内の特定の行に単純にジャンプする方法はありません。

ファイルのより大きなチャンクをバッファに読み込んでそこから行を読み取るなど、ファイル内の行を読み取る方法は他にもあるかもしれませんが、数パーセント速くなることを期待できます。ファイル内の特定の行を見つける方法は、その行までのすべてのデータを読み取る必要があります。

于 2010-08-27T22:44:45.350 に答える
4

投稿が遅れていることはわかっていますが、ある日 fseekbyline のような機能を実行した一部の人を助けることができます...

function GoToLine($handle,$line)
{
  fseek($handle,0);  // seek to 0
  $i = 0;
  $bufcarac = 0;                    

  for($i = 1;$i<$line;$i++)
  {
    $ligne = fgets($handle);
    $bufcarac += strlen($ligne);  // in the end bufcarac will contains all caracters until the line
  }  

  fseek($handle,$bufcarac);
}

エラー システムはありません。行 <1 または 203 に移動したいが、ファイルが空である場合...何も得られません。

あなたがeotから出たい場合も同じです

于 2011-09-30T21:22:52.783 に答える
1
rewind($handle);

for ($i=0; $i < $desired_line; $i++) {
    fgetcsv($handle, 1000, ",");
}

スクリプトで特定の行に複数回巻き戻す必要がある間、これは私にとってはうまくいきます。

これがメモリや速度を消費するかどうかはわかりませんが、うまくいきます。

于 2014-07-22T14:07:14.183 に答える
0

私の理解が正しければ、エラーを見つけた後、ある時点で特定の行をシークしたいと思うでしょう。その場合、「通知」の意味に応じて、おそらく不良行の行番号をどこかに保存または印刷します。

*を使用できないことを本当にfseek()意味している場合を除き、できることは、ファイル内の不良行の開始位置を保存/出力することです。その後、できますfseek()

* その場合、それが存在する場合、どのfseekbyline()ように使用できますか?

于 2010-08-28T01:21:04.513 に答える