web-dev-qa-db-ja.com

StreamReaderは位置を取得して設定します

大きなCSVファイルを読み取り、ストリームの位置をリストに保存したいだけです。その後、リストから位置を読み取り、Streamreaderの位置をその文字に設定して行を読み取る必要があります!!しかし、最初の行を読んでストリームポジションを返した後、

StreamReader r = new StreamReader("test.csv");
r.readLine();
Console.WriteLine(r.BaseStream.Position); 

ファイル内の合計文字数である「177」を取得します。 (これは短いサンプルファイルにすぎません)私はここでそのようなものを見つけられませんでした!

どうして?

完全な方法:

private void readfile(object filename2)
{
    string filename = (string)filename2;
    StreamReader r = new StreamReader(filename);
    string _top = r.ReadLine();
    top = new Eintrag(_top.Split(';')[0], _top.Split(';')[1], _top.Split(';')[2]);
    int siteindex = 0, index = 0;
    string line;
    sitepos.Add(r.BaseStream.Position); //sitepos is the a List<int>

    while(true)
    {
        line = r.ReadLine();
        index++;
        if(!string.IsNullOrEmpty(line))
        {
            if (index > seitenlaenge)
            {
                siteindex++;
                index = 1;
                sitepos.Add(r.BaseStream.Position);
                Console.WriteLine(line);
                Console.WriteLine(r.BaseStream.Position.ToString());
            }
        }
        else break;
        maxsites = siteindex;
    }
    reading = false;
}

ファイルは次のようになります。

name;age;city
Simon;20;Stuttgart
Daniel;34;Ostfildern

など、プログラムの演習です。 http://clean-code-advisors.com/ressourcen/application-katas (Katas CSVビューア)私は現在、文芸3にいます。

8
coolerfarmer

StreamReaderはバッファリングされたストリームを使用しているため、StreamReader.BaseStream.Positionは、ReadLineを使用して実際に「読み取った」バイト数よりも進んでいる可能性があります。

あなたがやろうとしていることをどのように行うかについての議論があります this SO question

13
Ergwun