2011-06-29 20 views
1

タイトルとして、2つ以上の文字間のスペースを1つのスペースに置き換えようとしています。しかし、次のコードは非常に大きな入力ファイルでは機能しません。巨大な入力ファイルに対しても、どうやって動作させることができますか?単純な読み書き巨大な入力ファイルの問題

static void Main(string[] args) 
    { 
     Regex pattern = new Regex(@"[ ]{2,}"); //Pattern = 2 or more space in a string. 

     StreamReader reader = new StreamReader(@"C:\CSharpProject\in\abc.txt"); 
     string content = reader.ReadToEnd(); 
     reader.Close(); 

     content = pattern.Replace(content, @" "); //Replace 2 or more space into a single space. 
     StreamWriter writer = new StreamWriter(@"C:\CSharpProject\out\abc.txt"); 
     writer.Write(content); 
     writer.Close(); 
    } 
+0

可能であれば、ファイル全体を文字列に読み込むことは間違いありません。 Streamsの重要な点は、一度に少しずつ作業することができることです。文字列のように扱うことができるように、RAMに4GBのファイルをロードする必要はありません。 – Pat

+0

本当に正規表現を使用する必要がありますか?あなたはファイル(char by char)を読み、boolスイッチを使って空白文字を保持するかどうかを判断できます。 – Goran

答えて

2

ライン・バイ・ライン、このような:

static void Main(string[] args) 
{ 
    Regex pattern = new Regex(@"[ ]{2,}"); //Pattern = 2 or more space in a string. 

    using (StreamReader reader = new StreamReader(@"C:\CSharpProject\in\abc.txt")) 
    using (StreamWriter writer = new StreamWriter(@"C:\CSharpProject\out\abc.txt")) 
    { 
     string content; 
     while (null != (content = reader.ReadLine())); 
      writer.WriteLine (pattern.Replace (content, " ")); 

     writer.Close(); 
     reader.Close(); 
    } 
} 
+0

このコードで改行を失うことはありませんか? 'ReadLine'は行区切り文字を返さず、' Write'を使っています。 – CodesInChaos

+0

@CodeInChaos、oops。私の最初のドラフトは間違っていたが、それを捕まえた。ありがとう –

+0

Thx、それは動作します。しかし、私はセミコロンを閉じ括弧で置き換える必要があります:while(null!=(content = reader.ReadLine()); – Victorgalaxy

0

ファイルには、すべてを一度読まれています。限界があります。 reader.ReaderToEnd()の代わりに、reader.ReadLine()を使用して、一度に1行ずつファイルを読み込んで処理します。または、ファイルに "行"がない場合は、入力ファイルをチャンクで読み取り、処理中の出力チャンクを保存します。

関連する問題