3

5000行のテキストファイルを読み込もうとしています。ただし、100行ごとに最初の10行だけを取得したいと思います。したがって、1〜10行目、101〜110行目、200〜210行目などです。使用するロジックがわかりません。

$count = count(file($text))

for ($i = 0; $i < $count; $i++) 
 {
 $test = fgets($f_text)
 }
4

3 に答える 3

5

を使用% 100し、行のみを印刷します$n % 100 > 0 && $n % 100 <= 10

$lines = file($text);
foreach ($lines as $n => $line) {
  if ($n % 100 > 0 && $n % 100 <= 10) {
     echo $line; // or whatever
  }
}

ロジックがどのように機能するかのサンプル:

foreach (range(0,250) as $n => $line) {
  if ($n % 100 >= 1 && $n % 100 <= 10 ) {
    echo $i . "\n";
  }
}

1 2 3 4 5 6 7 8 9 10 101 102 103 104 105 106 107 108 109 110 201 202 203 204 205 206 207 208 209 210
于 2012-07-29T23:51:14.363 に答える
1

SPLFileObjectファイル内の行数がわかっている限り、これを で簡単に実行できます。

$file = new SplFileObject( $filename, "r");

$lines = 0;
while ( !$file->eof()) {
   $file->fgets();
   $lines++;
}

$linesこれで、ファイルに多数の行があることがわかりました。それが静的な場合、たとえば 5000 の場合は、5000 に初期化$linesします。そうでない場合は、最も近い 100 に丸めましょう。

$lines -= ($lines % 100);

ここで、100 個ごとにループし、10 個のグループを探して、必要なデータを取得します。

$data = array();
for( $i = 0; $i < $lines; $i += 100) {
    $file->seek( $i);
    for( $j = 0; $j < 10; $j++) {
        $data[] = $file->fgets();
    }
}

このソリューションでは、ファイル全体をメモリにロードすることはありません。これにより、大きなファイルを処理するときにリソースが節約されます。また、ファイルのサイズが事前にわかっている場合は、必要なデータ行だけを読み取ることができます。

于 2012-07-29T23:56:11.243 に答える
0

他の両方の回答に基づいて、おそらく最もメモリ効率の良い方法です:

foreach(new SplFileObject($filename) as $n => $line)
    if($n % 100 < 10)
        echo $line;
于 2012-07-30T00:07:55.540 に答える