1

次のコードを大きなファイルで動作するように変更したいと思います。

    public static void Replace(string filePath, string searchText, string replaceText)
    {
        StreamReader reader = new StreamReader(filePath);
        string content = reader.ReadToEnd();
        reader.Close();

        content = Regex.Replace(content, searchText, replaceText);

        StreamWriter writer = new StreamWriter(filePath);
        writer.Write(content);
        writer.Close();
    }

ファイルストリームを開いて新しいファイル名に書き込み、完了したら元のファイルを削除して新しいファイルに置き換える必要があると考えています。それは正しいと思いますか?

また...このルーチンのシンプルさが気に入っています。必要なファイル I/O コード行を除けば、ファイルを処理するコードは 1 行だけです。ただし、単純化のためにパフォーマンスを犠牲にしているかどうかも疑問に思っています... Regex.Replaceは非常にパフォーマンスが高いですか?

4

3 に答える 3

1

最初:試すことができますRegex with Stream(より高速でメモリ要件が少ないようです):

または参照してくださいMono-Project Regex。ストリーミング付きの正規表現があります。

正規表現のパフォーマンスについては、次の記事を参照してください。

または、使用Regexする必要がない場合はString.Replace、次の 1 行のコードを使用して試してください。

File.WriteAllText(filePath, 
                  File.ReadAllText(filePath).Replace(searchText, replaceText));
于 2012-07-26T05:33:19.617 に答える
1

Regex を高速化する 1 つの方法は、RegexOptions.Compiled オプションを渡すことです。これにより、正規表現が取得され、ステート マシンが IL にコンパイルされます。これにはコンパイル手順のオーバーヘッドがありますが、コンパイルが完了すると、正規表現の実行が速くなります。明らかに、正規表現のコンパイルがシナリオに役立つか、または害を及ぼすかを確認するために、コードの時間を計る必要があります。

于 2012-07-26T05:37:46.620 に答える
0

Fileクラスを使用して、正規表現なしでも実行できます

public static void Replace(string filePath, string searchText, string replaceText)
{
   string newText = File.ReadAllText(filePath).Replace(searchText, replaceText));
   File.Delete(filePath);
   File.WriteAllText(newFilePath, newText);
}
于 2012-07-26T06:07:49.263 に答える