0

データモデルのようなテーブルがあります:

fieldA (10 chracters UTF-8)

fieldB(12 characters UTF-8)

fieldC (11 characters UTF-8)

各フィールドは固定長であり、UTF-8 エンコード (StreamWriter を使用して書き込まれる) で区切り記号なしでファイル (ディスク上のローカル ファイル) に書き込まれます。結果のファイルは次のようになります。

fieldAfieldBfieldCfieldAfieldBfieldC [...]

また、レコードの量もわかっており、ファイルへのランダム アクセスに BaseStream.Seek() を使用できます。

たとえば、29 番目のレコードを読み取ってデータモデルを埋めたいとします。効率的な (高速な) アプローチは何でしょうか? StreamReader を使えば char 単位で読めるのですが、UTF-8 だから問題ないのでしょうか? データにコンマを追加して文字列分割メソッドを使用したくありません-C#でこれに対するより良いアプローチがあることを願っています。

これは本番用ではありません。クレイジーでマイクロな最適化は大歓迎です:)

助けてくれてありがとう!

4

3 に答える 3

0

ファイル内の適切な場所をシークし、 を使用FileStream.Read()して適切な数の UTF8 文字を読み取り、次の方法で C# 文字列に変換できます。

string s = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

または、正しいエンコーディングで開かれた StreamReader を使用してStreamReader.Read(char[] buffer, int index, int count)、(正しい場所にシーク​​した後) を使用して正しい文字数を読み取ることができます。

OPで言うように、これは実際に正しい場所を探すことができる場合にのみ機能します!

可変長 UTF8 エンコード文字に関するコメントを読んでください!

于 2013-05-23T11:21:35.060 に答える
0

utf8 は可変幅エンコーディング (つまり、さまざまな文字を表すために可変バイト数を使用する) であるため、最初からスキャンする以外に選択肢はほとんどありません。

計算してオフセットにジャンプしたい場合は、固定サイズのエンコーディング、つまり UTF-32 を使用する必要があります。

于 2013-05-23T11:25:49.160 に答える
0

各フィールドは固定長であり、UTF-8 エンコード (StreamWriter を使用して書き込まれる) で区切り記号なしでファイル (ディスク上のローカル ファイル) に書き込まれます。

あなたのフィールドは固定長だと言います。つまり、ファイルの fieldA は常に 10 バイト (実際のコンテンツに関係なく)、fieldB は常に 12 バイト、fieldC は常に 11 バイトです。

以上のことから、テキストが UTF-8 であることは問題とは関係ありません。

System.IO.Stream を開くと、読み取りたくない各フィールドのバイトを確認できます。たとえば、fieldC を読み取りたい場合は、22 バイト先をシークできます (fieldA と fieldB をスキップします)。

stream.Seek(22, SeekOrigin.Current);

正しい場所に到達したら、固定バイト数を読み取り、それらのバイトを UTF-8 経由で結果の文字列にデコードできます。

于 2013-05-23T11:36:01.483 に答える