0

いくつかの大きなCSVファイルを処理するシステムがあります。

これらのファイルに、実際のコンマ区切りのコンテンツの前に、区切られていない、価値のない行が多数含まれている可能性があるというシナリオが発生しました。

私が採用したアプローチは、余分な行の数を確認するための一時的なリーダーを作成し、処理の準備ができているその数の行で作業中のTextReaderを移動することです。

私のコードは次のとおりです。

private static TextReader PrepareReader(TextReader reader)
    {
        // Variables
        TextReader tmpReader = reader;
        Int32 superfluousLineCount = 0;

        // Determine how many useless lines we have
        using (tmpReader)
        {
            string line;
            string headerIdentifier = "&1,";
            while ((line = tmpReader.ReadLine()) != null)
            {
                // Check if the line starts with the header row identifier
                if (line.Substring(0, 3) != headerIdentifier)
                {
                    // Increment the superfluous line counter
                    superfluousLineCount++;
                }
                else
                {
                    break;
                }
            }
        }

        // Move the source reader through how many lines we want to ignore
        using (reader)
        {
            for (int i = superfluousLineCount; i > 0; i--)
            {
                reader.ReadLine();
            }
        }

        // Return
        return reader;
    }

ただし、reader.ReadLine();コードのこの部分では、次のようになります。

for (int i = superfluousLineCount; i > 0; i--)
{
reader.ReadLine();
}

...次の例外をスローします

閉じたTextReaderから読み取ることはできません。mscorlibメソッドのObjectDisposedException:Void ReaderClosed()

スタックトレース:System.IO .__ Error.ReaderClosed()、System.IO.StreamReader.ReadLine()、CsvReader.PrepareReader(TextReader reader)、CsvReader.cs:line 93

どんなアドバイスも大歓迎です。また、私の挑戦に取り組むための最良の方法はありますか?

注:Framework 2.0

ありがとう。

4

2 に答える 2

7

使用しusing (tmpReader)ているときは閉じますtmpReader(これは同じオブジェクトを参照します)ので、ループ内readerから読み取ろうとすると閉じます。reader

最善の策は、2つのループを組み合わせることです。行をスキップしたいだけの場合は、最初のループのロジックで十分だと思います。

于 2012-06-14T15:06:49.577 に答える
0

私はあなたが単にこれをしなければならないと思います(それを正規化/修正します、私はコンパイルやテストなしでいくつかの単純化をしました):

    // edit
    private static TextReader PrepareReader(TextReader reader, out string outLine)
    {



            string line;
            string headerIdentifier = "&1,";
            while ((line = reader.ReadLine()) != null)
            {
                // Check if the line starts with the header row identifier
                if (line.Substring(0, 3) != headerIdentifier)
                {
                    // ... do nothing
                }
                else
                {
                    // edit
                    outLine = line;
                    break;
                }
            }

    }

IOWは入力参照を使用し、リーダーを目的の場所に移動します。

この方法以外では、リーダーを閉じるように注意してください

于 2012-06-14T15:14:20.350 に答える