PHP每10行读取100行中的一行

3

我正在尝试读取一个5000行的文本文件。但是我只想获取每100行中的前10行。因此第1-10行,第101-110行,第200-210行等。我只是无法想出要使用的逻辑。

$count = count(file($text))

for ($i = 0; $i < $count; $i++) 
 {
 $test = fgets($f_text)
 }
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

感谢您的快速回复。您的代码运行得很好,我只是试图理解其背后的逻辑。如果$n等于11,那么11%100不就是1吗?然后输出11? - Calgar99
1
% 是模运算符。它返回余数。因此,11/100 的结果是 0,余数为 11,而不是 1。 - iWantSimpleLife
谢谢,我之前考虑的正好相反。你的帮助非常感激。 - Calgar99

1

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

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

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

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

$lines -= ($lines % 100);

现在,我们只需循环遍历每一百个,寻找到十个分组,并获取我们想要的数据:
$data = array();
for( $i = 0; $i < $lines; $i += 100) {
    $file->seek( $i);
    for( $j = 0; $j < 10; $j++) {
        $data[] = $file->fgets();
    }
}

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

为什么要那样阅读呢?直接将逻辑放在循环中开始。 - Ry-
这个程序不会将整个文件读入内存,只会将需要操作的数据加载到内存中。 - nickb
我知道,但既然你已经循环计算行数了,为什么不在那里读取它们呢?这样做两次是浪费的。 - Ry-
你可以这样做,我将逻辑分开以便于如果 OP 想要将 $lines 声明为静态值。 - nickb

0

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

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

你能解释一下发生了什么吗?我不明白 ($n % 100 < 10),因为按照我的想法,11 % 100 应该等于 1 吧? - Calgar99
@user1544223:11 对 100 取模的结果是 11。 - Ry-
可能是因为太晚了,我的大脑已经糊掉了,但是模数不是给你余数吗?所以答案不应该是1吗?你说得对,答案是11,但我只是想理解一下。再次问这个问题让我感到很愚蠢。 - Calgar99
@user1544223:11除以100的余数是11。11 < 100。你是在想11模10吗? - Ry-
啊,好的。对不起,你是正确的,我看错了。感谢您为我澄清这一点,也感谢您花费时间。 - Calgar99

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接