0

请记住,我打开的文件可以是 10mb 到 125mb。我研究了各种打开文件的方法,但仍然不确定哪种方法最好。请指教!

我正在打开一个大文件并尝试在每次第一次出现时提取两个字符串之间的文本。我可以找到第一个字符串并将文本提取到第二个字符串,但是,我的循环给了我 12 次结果(这个文件中出现字符串的次数。我可以看到我在循环中做错了什么,基本上找到了第一次出现并重复其输出 12 次。如何遍历文件并获取第 2-12 次出现之间的文本?

此外,有关正确打开大文件和处理内存限制的任何提示都会很棒。

如果将其放入数组中,我会丢失空格吗?我正在使用 PRE 正确显示它。最终,我想将找到的每个字符串解析为数组或数据库中的较小元素。我不想超越自己,因此如有必要,请忽略数组注释。

<?php
ini_set('memory_limit', '-1');

/*
Functions
*/

function get_string_between($string, $start, $end){ 
    $string = " ".$string; 
    $ini = strpos($string,$start); 
    if ($ini == 0) return ""; 
    $ini += strlen($start); 
    $len = strpos($string,$end,$ini) - $ini; 
    return substr($string,$ini,$len); 
} 

/*
Pre Loop
*/

$string1 = "String 1";
$string2 = "String 2";

$report = file_get_contents('report.rpt','r');

$cbcount = substr_count($report,$string1);

echo $cbcount;

/*
Loop
*/

for ($i=0; $i<$cbcount; $i++){

$output = get_string_between($report, $string1, $string2); 

echo "<pre>".$output."</pre>";

}

?>
4

2 回答 2

3

你从来没有真正推进任何类型的指针,所以它无法知道它已经找到了第一个匹配项。

现在,根据您的输入,您可以只使用正则表达式:

preg_match_all("(".preg_quote($string1).".*?".preg_quote($string2).")s",$report,$matches);

(用这个替换整个循环)

然后你可以var_dump($matches[0])看到你的输出。

于 2013-02-22T16:23:16.097 回答
0
$startfrom = 0;
while (($start = strpos($string1, $report, $startfrom)) !== false) {
    $end = strpos($string2, $report, $start);
    echo "<pre>".substr($report, $start, $end-$start)."</pre>";
    $startfrom = $end + 1;
}

关于处理大文件,你可以使用fopen()andfgets()逐行读取,而不是将整个内容读入内存。当您找到包含 的行时,$string1您开始在变量中累积行,直到找到包含 的行$string2。这仅在匹配字符串不能包含换行符时才有效。

于 2013-02-22T16:24:56.667 回答