4

約 25,000 行のテキスト ファイルがあります。約525kb。

一部の行には、先頭にランダムなテキストがあります。セミコロンの長い文字列を持つものもあります。

他のいくつかは、同じ行に 3 つのセミコロンとスペース、および必要に応じて追加のテキストしかありません。これらは、削除したい行です。

ここにサンプルがあります....

   ;;; Updated Time 20120706122706
   ;;; Generic DEveloper Output

   ;;; Some Random Comments
   ;;; I got some more...
   ;;; Yet another uneeded line
   ;;; Thanks for using StackOverflow <http://stackoverflow.com>, or...
   ;;; Not.

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Banana Production

   [Data_Release_Version]
   Version=12586
   Released=20120706122706

   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baseline Properties

   [BaseLineProperties]
   Comment=BaselineProperties

- - - 等々。

4 以上で最初の行に到達したら ; 行には、「;;;」行がないため、残りのファイルが必要です。

「;;;」と一致しない場合は、すべての行を読み取って書き戻すのではなく、何かをすばやく見つけようとします。

ファイルは ASCII (おそらく UTF-8) テキスト タイプのファイルです。

何か案は?

あなたの時間、援助、知識に感謝します。

4

3 に答える 3

4

私が提案するのは、file_get_contents()ファイルの内容を変数に文字列として使用して保存し、explode()その文字列をすべての改行文字で使用し、foreachループで使用preg_match()して、行が 3 つのセミコロンとスペースで始まるかどうかを確認することです。という名前の別の配列に入れ$outputます。foreach の後implode() $outputに改行文字を追加しfile_put_contents()、別のファイルに出力するために使用します。お役に立てれば :-)

コード:

<?php
$string = file_get_contents($filename);
$array = explode("\n",$string);
foreach($array as $arr) {
    if(!(preg_match("^;;;\s",$arr))) {
        $output[] = $arr;
    }
}

$out = implode("\n",$output);
file_put_contents($path,$out);
?>
于 2012-07-29T07:22:02.353 に答える
1

依存..文字列にロードしてから、改行でexplode()を実行しようとするので、配列内にあり、strpos == 0 -AND- strpos !== false を持たないものに対してスキップして foreach を実行します、一致しない場合は次の行にスキップするために続行を入れることができます。

別のオプションは、解析してスキップするか、fseek などを使用することです。何が最速になるかを決定するために、多くのさまざまな要因に依存します。

後で内破し、改行を追加してから、ファイルをプッシュしたり、改行を使用したりできます。出力がどこに行くべきかによって異なります。

于 2012-07-29T06:53:14.730 に答える
0

あなたは自分で答えを出したと思います:

入力ファイルをループ(while)で1行ずつ読み込むスクリプトを作成します。次の 2 つの条件が満たされる場合、すべての行が出力ファイルに書き込まれます: 1. フラグ ("完了") が FALSE であり、2. 行が ";;;" (空白ではない) で始まっていない。これにより、3 つのセミコロンで始まる行が削除されます。より多くのセミコロンを含む行に到達したら、フラグを TRUE に設定すると、残りの行は検査されずにコピーされます。

于 2012-07-29T06:52:08.420 に答える