8

正規表現を使用してファイル内のテキストを置き換えるための例がたくさん見つかりました。ただし、すべて2つのバージョンに
要約されます。1。ファイル内のすべての行を反復処理し、各単一行に正規表現を適用します
。2.ファイル全体をロードします。

No.2「my」ファイルを使用することはできません-約2GiBです...
No。1に関しては、現在これが私のアプローチですが、疑問に思っていました...複数にまたがる正規表現を適用する必要がある場合はどうなりますかライン ?

4

6 に答える 6

2

これが答えです:
簡単な方法はありません

私が探していることを実行できるStreamRegex-Classを見つけました。
私がアルゴリズムを把握できるものから:

  • 空のバッファでファイルの先頭から開始します
  • 行う (
    • ファイルのチャンクをバッファに追加します
    • バッファに一致がある場合
      • 一致をマーク
      • マッチ終了前に出現したすべてのデータをバッファから削除する
  • ) まだファイルが残っている間

そうすれば、完全なファイルをロードする必要はありません-または、少なくとも完全なファイルをメモリにロードする可能性が減少します...
ただし、最悪の場合、ファイル全体に一致するものがないことです-この場合、完全なファイルがメモリにロードされます。

于 2009-11-19T08:31:53.810 に答える
1

Regex is not the way to go, especially not with these large amounts of text. Create a little parser of your own:

  • read the file line by line;
  • for each line:
    • loop through the line char by char keeping track of any opening/closing string literals
    • when you encounter '/*' (and you're not 'inside' a string), store that offset number and loop until you encounter the first '*/' and store that number as well

That will give you all the starting- and closing-offset numbers of the comment blocks. You should now be able to replace them by creating a temp-file and writing the text from the original file to the temp file (and writing something else if you're inside a comment block of course).

Edit: source files of 2GiB??

于 2009-10-02T13:42:09.643 に答える
0

私はバートと一緒です。これには、実際に何らかのパーサーを使用する必要があります。

または、子プロセスを生成してもかまわない場合は、sedを使用できます(Windowsにネイティブポートがあるか、 Cygwinを使用できます) 。

于 2009-10-03T00:47:00.787 に答える
0

おそらく、一度に 2 行 (またはそれ以上、マッチがスパンすると思われる行数に応じて) をロードし、それらをオーバーラップさせることができます。 、次のロード 3-4; 各ループで、両方の行を組み合わせて複数行の正規表現を実行します。

于 2009-10-02T13:27:14.527 に答える
0

少し手を汚しても構わない場合 (そして、正規表現が十分に単純であるか、またはおそらく速度に対する強い欲求があり、多少の苦労を気にしない場合) は、Ragelを使用できます。サイトでは言及されていませんが、C# をターゲットにすることができます。ただし、大きなファイルでこれを使用するには、FileStream をラップしてバッファリングされたインデクサーを提供するか、64 ビット プロセスでメモリ マップされたファイル (安全でないポインターを含む) を使用する必要があります。

于 2009-11-19T08:51:25.203 に答える
0

置換を行う前にデータを事前に解析/正規化して、置換を適用する必要がある可能性のあるデータのセットを各行に記述する必要があると思います。そうしないと、他の多くの問題がなければ実際には解決できないデータの整合性に関する問題が発生します。

データを論理ブロックに分割する方法があれば、mapreduce パターンを使用してデータを解析するプログラムを作成できます。

于 2009-10-02T14:47:18.790 に答える