0

私が開いているファイルは10mbから125mbである可能性があることに注意してください。私はファイルを開くためのさまざまな方法を研究しましたが、どれかが最善であるかどうかはまだわかりません。お知らせ下さい!

私は大きなファイルを開いて、最初の文字列が発生するたびに2つの文字列の間のテキストを抽出しようとしています。最初の文字列を見つけてテキストを2番目の文字列に抽出できますが、ループでその結果が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;
}

大きなファイルの処理に関しては、すべてをメモリに読み込む代わりに、ファイルを1行ずつ使用fopen()fgets()て読み取ることができます。を含む行を見つけると、を$string1含む行が見つかるまで、変数に行を蓄積し始めます$string2。これは、一致文字列に改行を含めることができない場合にのみ機能します。

于 2013-02-22T16:24:56.667 に答える