0

解決策を見つけるためにインターネット全体を調べました。しかし、それらはすべて重要な問題を無視しています。最良の解決策は、スタックオーバーフローにありました

  $file = new SplFileObject('longFile.txt');
    $fileIterator = new LimitIterator($file, 1000, 2000);
    foreach($fileIterator as $line) {
    echo $line, PHP_EOL;
    } 

ただし、他のアプローチと同様に、これはオフセット行に到達するためにファイルの先頭から読み取る必要があります。通常、それは無視できます。ただし、大きなファイル (数百万行など) の場合、これによりプロセスが大幅に遅くなります。時間は、オフセットの増加によって単調に増加します。オフセットを数百万にすると、処理時間は数秒になります。

データベース (mysql など) では、テーブルにインデックスを付けて、データベース全体を調べずに行を読み取ります。ファイルキー(行番号)でそのようなことをすることはありますか?SQLite や Berkeley DB などのフラット ファイル データベースは、どのようにテーブルにインデックスを付けているのだろうか。

4

3 に答える 3

2

「行」という用語は単なる慣例であるため、特定の行を探す方法はありません。行は「\nで区切られた文字のセット」です。そして、ファイルはこの規則について何も知りません。したがって、N番目の行を取得するには、文字ごとにトラバースして、必要な行数をカウントする必要があります。

あなたが言ったように-あなたはある種のカスタム作成されたインデックス(row number - offset in bytesリストのような)を使ってパフォーマンスを改善することができます、しかしそれを構築するためにあなたはとにかくファイルを解析する必要があります。

于 2011-09-14T06:13:41.847 に答える
1

ここでの概念上の問題は、ファイルは単なる文字列であり、これらの文字の一部は行末を示しているということです。そのため、最初にファイルを読み取らないと、行の開始位置と終了位置を知ることはできません。

ファイルを常に読み取る必要がある場合は、最初にファイルをスキャンし、行のオフセットをある種のインデックスに記録し、fseek()fread()を使用して目的の行を正確に読み取ります。

あなたが言ったように、データベースはあなたのために同様の仕事をすることができるので、基本的に独自のデータベースを作成する代わりに、ファイルを行ごとに読み取り、それらの行をデータベースに挿入し、行番号を格納するフィールドを使用して取得することができますクエリで必要な行。

于 2011-09-14T06:29:00.623 に答える
-1
<?php

    $strings = file_get_contents($file);

    $length= strlen($strings);

    for($i=0;$i<$length;$i++) {
        print $strings{$i};
    }

?>

上記のコードは、ファイルの内容を文字列で取得し、各文字を1つずつ繰り返します。これで、それらをどのように使用するかはあなた次第です。

于 2011-09-14T06:17:01.917 に答える