PHP每100行读取一次

时间:2012-07-29 23:48:09

标签: php text-files nested-loops

我正在尝试读取5000行的文本文件。但是我只想获得每100行的前10行。所以1-10行,101-110行,200-210行等等。我只是想弄清楚要使用的逻辑。

$count = count(file($text))

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

3 个答案:

答案 0 :(得分:4)

使用% 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

答案 1 :(得分:1)

只要您知道文件中有多少行,就可以使用SPLFileObject轻松完成此操作:

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

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

现在您知道文件中有$lines行数。如果这是静态的,比如5000,只需将$lines初始化为5000.如果不是,那么让我们将其向下舍入到最近的100:

$lines -= ($lines % 100);

现在,我们只是遍历每一百个,寻求10的分组,并获取我们想要的数据:

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

使用此解决方案,您永远不会将整个文件加载到内存中,这将在处理大文件时节省资源。此外,如果您事先知道文件的大小,则只会读取所需的数据行。

答案 2 :(得分:0)

基于其他答案,可能是最节省内存的方法:

foreach(new SplFileObject($filename) as $n => $line)
    if($n % 100 < 10)
        echo $line;