0

大きなテキスト ファイル (14MB) を読み取り、各行を文字列のリストに入れようとしており、そこから個別の文字列を取得してから、別のテキスト ファイルに書き戻そうとしています。次のコードを使用します。

    static void removeDuplicates(string filename)
    {
        //Reading from the file
        Console.WriteLine("Reading from the file....");
        StreamReader sr = new StreamReader(filename);
        List<string> namesList = new List<string>();
        while (!sr.EndOfStream)
        {
            namesList.Add(sr.ReadLine());
        }

        //Getting the distinct list
        namesList=namesList.Distinct().ToList<string>();           


        Console.WriteLine("Writing to the new file");
        //writing back to the file
        StreamWriter sw = new StreamWriter(filename + "_NoDuplicates",false);
        for (int i = 0; i < namesList.Count; i++)
        {               
            sw.Write(namesList[i] + "\r\n");

        }
    }

問題は、streamWriter が常に特定の行数の後に書き込みを停止し、常に同じ場所で書き込みを停止することです。

List の内容が正しいこと、およびループがリスト内のすべての項目を通過することを確認しました。これは単なる streamWriter の問題です。

このリストには、Distinct() の前に 1048577 項目、Distinct() の後に 880829 項目が含まれています。

streamWriter は文字列番号 880805 の途中で書き込みを停止し、その後は何も書き込みません。単語の途中で停止することさえあります。

なぜそれが起こっているのですか、私は何を間違っていますか?

4

1 に答える 1

2

エラーが発生しない場合は、ファイルの最後のビットがまだバッファリングされていると思います。sw.Flush()メソッドの最後に呼び出しを追加してみてください。

そしてもちろん、ストリームを閉じる必要があります。これにより、とにかくバッファがフラッシュされます。

説明

StreamWriter内部的にバッファを使用します。データを呼び出すたびWrite()に、実際にはメモリ内のバッファに書き込まれます。バッファがいっぱいになると、ディスクにフラッシュされます。

あなたが見ていた問題は、あなたが書き込んでいるファイルの最後の数行がバッファをいっぱいにしなかったためです。そのため、バッファをディスクにフラッシュするトリガーがありませんでした。バッファのサイズの倍数の最後の整数であるため、ファイル内の同じポイントで常に発生します。ストリームを閉じると、残りのデータがディスクにフラッシュされます。

于 2012-04-16T00:54:18.317 に答える