2017-08-24 76 views
0

我有一个超过100,000行的非常大的文本文件。我需要收集/跳过设定数量的线路:循环线路1-100,跳过线路101-150,读取线路151-210,跳过线路211-300(例如)。PHP循环 - 跳过某些行

我有以下代码

$lines = file('file.txt'); 
$counter = 0; 

foreach ($lines as $lineNumber => $line) { 

    $counter++; 

    if ($counter < 101) { 
     //Do update stuff 
    } 

    if ($counter < 102 && $counter > 151) { 
     //Skip these lines 
    } 

    if ($counter < 152 && $counter > 211) { 
     //Do update stuff 
    } 
} 

有没有更好的方式来跳过一个阵列输出的多行?

+0

不是一个好主意,在内存中有一个大文件 –

+0

不要在这种情况下使用foreach,使用和利用计数器 – clearshot66

+0

用'fread'逐行读取文件 –

回答

2

首先,移动到fgets,这是内存有效的方式。你不需要在内存中拥有所有的数组。至于条件,只需将您的所有条件与or运营商相结合,不要添加跳过条件,这是没用的。

if ($counter < 101 || ($counter >= 151 && $counter <= 210) || add another pediods here) { 
    //Do update stuff 
} 

P.S.你在你的条件中有一个错误,($counter < 102 && $counter > 151)总是false以及另一个。

+0

使用fgets,我可以使用'w'而不是'r',这样我可以在完成逻辑处理后写入文件。 – Adam

+1

你是司机)你当然可以。使用'fseek'来进入它。 –

+0

@AdamA:如果您重视您的数据,则不需要。如果您想使用'fgets',请将更新的数据写入第二个文件。 (您的处理循环完成后,您可以将其移至输入文件的顶部)。 – cHao