3

ディレクトリ内のすべてのファイルのすべてのテキストをトリミングする機能があります。ここにコードがあります

var dbtables = System.IO.Directory.GetFiles(db);

foreach(var table in dbtables)
{
     string text = File.ReadAllText(table);
     File.WriteAllText(table, text.Trim());
}

このディレクトリには多くの大きなファイルがあり、完了するまでに約 30 分かかります。これを行うためのより速い方法を知っていますか?

4

2 に答える 2

2

各ファイルに対して推奨することは次のとおりです。

  1. 最初の文字を読み取ります。

  2. 空白の場合は、ファイル全体を書き直す必要があります。

    1. ファイル全体をメモリに読み込みます。
    2. 最初から文字ごとに反復して、最初の非空白文字を見つけます。
    3. 最後から 1 文字ずつ反復して、最初の非空白文字を見つけます。
    4. ファイルの先頭にシークします。
    5. 文字列の真ん中の文字だけをファイルに書き込みます。
    6. ファイルの長さを、書き込んだ文字数に設定します。
  3. 最初の文字が空白でない場合、先頭はトリミングされないため、末尾を切り捨てることができます。

    1. 空白ではない文字に到達するまで、ファイルを 1 文字ずつ逆方向に読み取ります。
    2. 空白が見つかった場合は、ファイルの長さを現在の長さから空白文字の数を引いた値に設定します。
于 2012-06-07T22:05:43.620 に答える
0

コードは現在、各行ではなく、各ファイル全体の先頭と末尾から空白を削除しています。行ごとに空白を削除する場合は、次を使用できます。

var dbtables = System.IO.Directory.GetFiles(db);

foreach (string table in dbtables)
{
    string temp = table + ".tmp";
    using (StreamWriter target = new StreamWriter(temp))
        foreach (string line in File.ReadLines(table))
            target.WriteLine(line.Trim());

    File.Delete(table);
    File.Move(temp, table);
}
于 2012-06-07T18:59:04.627 に答える