2011-08-08 10 views
2

私は10MBのテキストファイルを持っています。
行の長さが異なる場合があります。大きなテキストファイルから1行を読む

このファイルから特定の行を読み取るのに最も効率的な方法(高速でメモリに便利)はどれですか?例えばget_me_the_line($nr, $file_resource)

答えて

6

行の長さが異なる場合は、行にジャンプする方法がわかりません。しかし、何かのためにそれらを使用していないときにラインをかなり素早く繰り返して、興味のあるものを返すことができます。

function ReadLineNumber($file, $number) 
{ 
    $handle = fopen($file, "r"); 
    $i = 0; 
    while (fgets($handle) && $i < $number - 1) 
     $i++; 
    return fgets($handle); 
} 

編集

これは先に行を読み込むので、私はループに- 1を追加しました。したがって、$numberはゼロインデックスライン参照です。 1行目がファイルの最初の行を意味する場合は、- 2に変更してください。

2

行の長さがさまざまなので、行末を示す可能性があるため、各文字を見る必要があります。 Quickestは、ファイルシステムのブロックサイズのようなサイズのチャンクにファイルをロードし、必要な行になるまで改行を数えます。 より良い方法は、行を含むファイルに関する情報を格納するインデックスファイルを持つことです。データベースを使用することも良い考えです。

1

ファイルが本当に大きく(数GB以上)、アプリケーションが* nixで実行されている場合は、でない可能性があります。 PHPがファイルを処理して、そのような行に最適化された既存のUnixツール処理。そのようなツールがsedであり、巨大なファイルから特定の行を印刷する例は、hereです。

system_exec()コールでこれを囲み、探している機能を記述するのは簡単です。

+0

ちょうどOPを見たファイルはわずか10 MBです。それを逃した。このソリューションは、おそらく数百MB以下のものについては、移植性のヒットに値するものではありません。 –

+0

はい、それは最善の選択ですが、私はroot権限を持たず、 'exec'を実行できないため、PHPソリューションが必要です。 – Sfisioza

関連する問題