0

200000 行を含むテキスト ファイルがあります。最初の 50000 行を読み取り、それを処理してから、50001 から 100000 などの 2 番目の部分を読み取ります。 50001 読み始めます。

どうすればそれが可能になりますか?そのためにどのリーダーが使用されますか?

4

4 に答える 4

1

ストリームリーダーを使用するのが最善の方法だと思いますが、

ここにあなたの質問に関連する 2 つの質問があり、そこから回答を得ることができます。しかし、最終的にテキストのブロックを取得したい場合、それが一定量でない限り、それを行うのは非常に困難です.

ただし、これらはあなたが使用するのに適した読み物になると思います:

これは、コードのブロックを分離して読み取る方法を示しています。これに対する答えが最も適しています。読み取った行数を読み取る条件を設定し、行数 == 50000 かどうかを確認する条件を設定して、何かを行うことができます。

ご覧のように

この回答では、キーワード continue を使用しています。これは、あなたが意図していることに役立つと思います。

これは、より読みやすい回答を示していますが、読み取りブロックで探しているものには実際には回答していません。

あなたの質問に対して、あなたがやりたいことはあなたを少し混乱させたと思います.50000行を強調表示してから、それを1行として読みたいようです.それはstreamreaderの仕組みではありません.長くなりますが、残念ながらそうです。

于 2013-07-12T10:37:56.233 に答える
1

StreamReaderクラスが必要です。

これにより、メソッドを使用して行単位で読み取ることができますReadLine()。自分で行数を追跡し、50000 行ごとにデータを処理するメソッドを呼び出す必要がありますが、リーダーを開いたままにしておく限り、読み取りを再開する必要はありません。

于 2013-07-12T10:32:47.830 に答える
1

残念ながら、行のカウントをスキップする方法はありません。raw レベルのファイルでは、行番号ベースでは機能しません。代わりに、位置/オフセットベースで機能します。ルート ファイル システムには行の概念がありません。これは、上位レベルのコンポーネントによって追加される概念です。

そのため、オペレーティング システムに通知する方法はありません。指定された行でファイルを開いてください。代わりに、ファイルを開いて、指定された数を超えるまで新しい行のカウントをスキップする必要があります。次に、次の新しい行に到達するまで、次のバイト セットを配列に格納します。

ただし、各行に同じ数のバイトが存在する場合は、次を試すことができます。

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin);
    using( StreamReader reader = new StreamReader(stream) )
    {
        string line = reader.ReadLine();
    }
}
于 2013-07-12T10:36:50.817 に答える
0

行の長さがまったく同じでない限り、行 50001 から直接開始することはできません。

ただし、できることは、最初の 50000 行を読み取るときに、最後の行がどこで終わるかを覚えておくことです。その後、そのオフセットを直接シークして、そこから読み取りを続けることができます。

行の長さが固定されている場合は、次のようにします。

myfile.Seek(50000 * (rowCharacters + 2), SeekOrigin.Begin);

Seek はバイト単位の特定のオフセットに移動するため、50000 行が占めるバイト数を指定するだけで済みます。ASCII エンコーディングの場合、これは行内の文字数に改行シーケンスの 2 を加えたものです。

于 2013-07-12T10:30:57.540 に答える