4

私が行っているプロジェクトでは、プレーンテキスト ファイルの最初の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行から始まる行番号などの小さなもののために...また、効率と形式の点で良いコードかどうかもわかりません.

本当にありがとう。

4

4 に答える 4

10

短いのが好き…

File.WriteAllLines(
    fileName,
    File.ReadAllLines(fileName).Skip(numberLinesToSkip).ToArray());
于 2009-10-03T23:26:29.950 に答える
6

大丈夫です。あなたが恐れているオフバイワンの問題はないようです。ただし、より無駄のないアプローチは、2 つの別個のループによって提供されます。1 つは入力ファイルから最初の X 行をカウントするだけで (それ以外は何もしません)、もう 1 つは他の行を入力から出力にコピーするだけです。つまり、単一のwhileループの代わりに...:

    while ((line = reader.ReadLine()) != null) {
        line_number++;

        if (line_number > lines_to_delete)
            break;
    }

    while ((line = reader.ReadLine()) != null) {
        writer.WriteLine(line);
    }
于 2009-10-03T23:17:50.390 に答える
2

I like your approach, I see nothing wrong with it. If you know for certain they are small files then the other suggestions may be a little less code if that matters to you.

A slightly less verbose version of what you already have:

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);
}
于 2009-10-04T00:09:50.783 に答える
0

ファイルを行の配列に読み取り、最初のいくつかの要素を無視して、残りを書き戻すことができます。

このアプローチの欠点は、メモリ内のファイルのサイズを消費することです。あなたのアプローチ(かなり読みにくいですが、不快感はありません)には、このメモリの問題はありません。ただし、ファイルが大きすぎない場合は、メモリ使用量について心配する必要はありません。

例:

string[] lines = System.IO.File.ReadAllLines("YourFile.txt").Skip(10).ToArray();
System.IO.File.WriteAllLines("OutFile.txt", lines);
于 2009-10-03T23:18:11.653 に答える