どのように私は、テキストファイルの最初の「X」の行を削除しますか?
質問
私がやっているプロジェクトでは、私がしなければならないことの一つは、平文ファイルの最初ののX の行を削除しています。私はのX の削除、私はこのルーチンを複数回と毎回、異なるものになります削除する行を実行する必要がありますが、彼らは常に最初からスタートしますので、最初ののX言っていますのと同じファイルに出力結果をます。
私は私が読んで、他のチュートリアルと例から一緒につなぎれ、このような何かをやって考えています:
String line = null;
String tempFile = Path.GetTempFileName();
String filePath = openFileDialog.FileName;
int line_number = 0;
int lines_to_delete = 25;
using (StreamReader reader = new StreamReader(originalFile)) {
using (StreamWriter writer = new StreamWriter(tempFile)) {
while ((line = reader.ReadLine()) != null) {
line_number++;
if (line_number <= lines_to_delete)
continue;
writer.WriteLine(line);
}
}
}
if (File.Exists(tempFile)) {
File.Delete(originalFile);
File.Move(tempFile, originalFile);
}
しかし、それは、効率や形の面で良いコードがある場合、これはまた、私にはわからない...ライン0またはその他もろもろから始まるので、行番号のような小さなものの仕事かどうかは分かりません。
おかげでたくさんます。
解決
これはOKだし、それはあなたが恐れるオフ対1の問題を持っているでしょう見ていません。 1だけで、入力ファイルから最初のXラインを数える(と他に何もしない)に、単に入力から出力まで、他の行をコピーするために、別の1 - しかしスリムアプローチは、2つの別々のループによってもたらされるだろう。すなわち、代わりに単一while
ループの、持っている...:
while ((line = reader.ReadLine()) != null) {
line_number++;
if (line_number > lines_to_delete)
break;
}
while ((line = reader.ReadLine()) != null) {
writer.WriteLine(line);
}
他のヒント
私は短いそれを好き...
File.WriteAllLines(
fileName,
File.ReadAllLines(fileName).Skip(numberLinesToSkip).ToArray());
私はあなたのアプローチが好き、私はそれと間違って何も見えません。あなたは、彼らは小さなファイルです特定のために知っていればそれがあなたにとって重要ならば、他の提案は少しコードであってもよい。
あなたがすでに持っているもののわずかに少ない冗長バージョン:
using (StreamReader reader = new StreamReader(originalFile))
using (StreamWriter writer = new StreamWriter(tempFile))
{
while(lines_to_delete-- > 0)
reader.ReadLine();
while ((line = reader.ReadLine()) != null)
writer.WriteLine(line);
}
あなたが最初の数の要素を無視し、行の配列にファイルを読み込み、背もたれを書くことができます。
このアプローチの欠点は、それがメモリ内のファイルのサイズを消費するということです。 (悪気はかなり読めないが)あなたのアプローチは、このメモリの問題を持っていません。ファイルが大きすぎていない場合が、メモリ使用量を心配する理由があってはならない。
例:
string[] lines = System.IO.File.ReadAllLines("YourFile.txt").Skip(10).ToArray();
System.IO.File.WriteAllLines("OutFile.txt", lines);