2011-11-08 12 views
0

ファイルから行単位で読み込んでいますが、私が読み込んだ行の一部を編集したいと考えています。 編集したい行には、上または下の行が必要ですしかし、私はC#でそれを表現する方法を知らない。たとえば :C#行単位でファイルをチェックする

http://www.youtube.com 
You Tube | Music | something 
Sports 
Music 
Radio 
Clips 
http://www.youtube.com/EDIT ME 
Sports 
Music 
Radio 
Clips 

と、私は次の行が

Sports 

で、前の行が

Clips 

だから私がしたいだけの行である場合にのみ行 を編集したいです上記の例の編集は

http://www.youtube.com/EDIT ME 
です

アイデア

+0

あなたのサンプルデータは正しいですか?あなたが最初のセクションをコピーして、あなたが望まないビットを編集しなかったようです。 –

答えて

6

ファイルを実際に「編集」することはできません。

  • ファイル全体をメモリに読み込みます。たとえば、次の2つの方法のいずれかを使用します。 File.ReadAllLinesを使用して、メモリを適切に変更して全体を書き換えます(File.WriteAllLinesなど)
  • 入力ファイルと出力ファイルの両方を同時に開きます。一度に1行ずつ読み込み、出力ファイルに対応するものを見つけ出し、その行を書き出します。

最初のバージョンは簡単ですが、明らかにより多くのメモリが必要です。あなたが言及したように、あなたが次の行と前の行を見る必要があるならば、それは特にです。最初のアプローチの

簡単な例:

string[] lines = File.ReadAllLines("foo.txt"); 
for (int i = 1; i < lines.Length - 1; i++) 
{ 
    if (lines[i - 1] == "Clips" && lines[i + 1] == "Sports") 
    { 
     lines[i] = "Changed"; 
    } 
} 
File.WriteAllLines("foo.txt", lines); 
1

ファイルがそれほど大きくない場合には、私は、文字列としてファイル全体で読んでいました。次に、indexOfや部分文字列などのメソッドを使用して自由に操作できます。

文字列が必要になったら、元のファイルに書き戻します。

2

アプローチ#1
ファイルをループしている間、前の行のための変数を保つ(必ずループの前に現在の行にこれを更新します)。現在の行と前の行を知ったので、現在の行を編集する必要があるかどうかを判断できます。

アプローチ#2
あなたは、例えば、いくつかの条件に対応するフラグを設定し、ファイルをループしている間私はちょうどSportsを見つけた。フラグを解除する必要がある条件を後で検出した場合など。私はちょうどRadioを見つけた、それを設定しないでください。 Clipsが見つかった場合は行を編集する必要があるかどうかを確認するためにSportsFlagが設定されているかどうかを確認できます。

2番目のアプローチは、より柔軟で(現在の行に応じて複数のフラグを設定および設定解除することができます)、SportsClipsの間に複数の線が混在する可能性がある場合に適しています。効果的に貧しい人々ですState Machine

関連する問題