0

テキストファイルを読み取る必要がありましたが、大きすぎるため、このファイルの一部の行のみを読み取ることにしました。特定の行のジャンプに seek メソッドを使用できますか? そのテキストファイルが大きすぎるため、ファイル全体を読むのに多くの時間を浪費しているため、その行しか読むことができません。それが不可能な場合、それに対するより良い解決策を提供する人はいますか? (指定された行を探して読み取る)(バイナリテキストファイルがバイト単位で読み取られていることは知っています)

私のファイルの例

event1 0

subevent 1

subevent 2

event2  3 

(あるイベントの後の私のファイルでは、前のイベントを探したい行数が表示されます)

4

4 に答える 4

1

はい、ファイル内のポイントをシークして、そこから読み取ることができます。考えられる問題の 1 つは、行の長さがすべて異なる場合、ファイル内のランダムな場所が長い行に含まれる可能性が高くなることです。さまざまな行の確率が均等に分散されていません。本当に同一の確率が必要な場合は、各行の開始を見つけるためにファイルを少なくとも 1 回通過させる必要があります。次に、これらのオフセットをベクトルに格納し、ベクトル要素をランダムに選択して、行データへのシークをガイドできます。ファイルで。少しだけ気にする場合は、おそらく、最初に求めていた行を超えて、少数ではあるがランダムな数の行を進めることができます...これにより、オッズが少し均等になり、最初のパスが回避されますが、完全ではありません. ハンスマール

于 2013-04-25T11:06:18.603 に答える
0

各行の長さがまったく同じでない限り、スキャンする必要があります。

その中をジャンプしたい場合は、それをスキャンして、各行のオフセットを選択したコンテナーに保存し、それを使用して特定の行を探すことができます。

于 2013-04-25T11:05:23.167 に答える
0

私の知る限り、行がどこにあるかを知らずに新しい行を探す組み込みの方法はありません。あなたの質問のほとんどは、あなたが実際に達成しようとしていることではなく、どのように達成しようとしているのかを詳しく説明しているため、目標を達成するための最良の方法を教えることはできません. したがって、次の 2 つの方法のいずれかを使用できます。

1) 実際にファイルの最後のビットすべてのデータが必要な場合 (破棄できるメタデータやその他の情報はありません):

ファイルをスキャンし、行を追跡し、一度に 1 行ずつ読み取ることができるようにインデックスを作成すると、誰かが言及しました。これは機能する可能性があり、実際に各行全体が必要な場合、または行番号のみが必要で、そこから一度に少しずつ読む予定がある場合に適しています。ただし、制約や要件の詳細を知らずに、この方法を使用して行全体を読むことはお勧めしません。これは主な理由の 1 つです。ファイルの1行?)。

代わりに、一度に処理するのに適切なサイズのバッファーを単純に割り当て、最後に到達するまでそのサイズのチャンクでファイルを処理します。より多くのデータをストリーミングできます。追加の詳細がなければ、そのマジック ナンバーがどうあるべきかはわかりませんが、処理する必要がある可能性のある情報の最大のチャンクのサイズは、最低限として適切な出発点です。

2) ファイルの最後のすべてのデータを必要としない場合 (情報の一部を破棄してもかまいません)、必要なのはその一部だけです。選択したデータのみが必要な場合は、タグ付けされていると見つけやすくなります (これが XML の目的です)。無料の XML パーサーはたくさんありますが、独自のパーサーを作成することもできます。次に、任意の行番号の代わりにタグを検索します。データが別の場所にあるという結果になるファイルへの変更は、タグ付けされている場合にファイルを見つける能力に影響しません。行番号で。

于 2013-04-26T12:31:45.103 に答える
0

行が可変/ランダムな長さであると仮定すると、特定の行の先頭に直接ジャンプする組み込みの方法はないと思います。ファイル内の任意のバイト位置にシークできます。ただし、これは行の先頭/中間/末尾のどこにでも着陸する可能性があります。

私の最善の提案は、次の 2 つのステップで問題を解決することです。

まず、各行の先頭を検索しながら、ファイルを 1 バイトずつ完全に通過させます。各行のバイト位置を記録し、配列、ベクトルなどに格納します (基本的に、行番号から開始位置にマップするインデックスを作成します)。次に、このインデックスが構築されると、簡単にジャンプできます。インデックス内の位置を検索して、特定の行に移動します。

于 2013-04-25T11:06:54.553 に答える