お世話になります。VB6.0でテキストファイルの読込みを、
しているのですが、2バイトコードが混ざっていると1レコード毎に
読込めない場合があります。ファイルの内容は下記の通りです。
123456789"0d""0a" ← バイナリエディタで見ると"9"と"0d:CR"が2バイト
aaaaaaa"0d""0a"
そのため読込み後のバッファの内容はこんな感じです。
1234567890d0a ← バイナリエディタで見ると"9"と"0d:CR"が2バイト
aaaaaaa0d0a
上手く1234567890d0aを1レコードとして読込む方法はないでしょうか?
アドバイスをよろしくお願いします。
意味がよくわかりません。
テキストファイルをMS-DOS型改行(vbCrLf 即ち &H0D,&H0A)ごとに
読み込みたいなら Line Input # または
Scripting.FileSystemObject.ReadLine すればいいのでは?
それともシーケンシャルファイルをバイナリで読みたいのですか?
レス有難うございます。
Line Inputを使っているのですが、
上手く読込んでくれないんです。
おそらく、1行目の"9"と&H0dが2バイト(全角文字)に、
なっているので、2レコード目のH0D,&H0Aまでを1レコードの、
認識しているみたいなんです。現象は分かっているのですが、
対象方法がPGMレベルで思い浮かばないんです。
レコードのサイズが可変なので、サイズ指定で読めないのも、
つらいところです。
アドバイスをよろしくお願いします。
意味がよくわかりません。
バイナリエディタで見て、
01 02 03 04 05 06 07 08 09 0d 0a
になっているのですか?
だとすればそれはテキストファイルではありません。
バイナリでオープンして
1バイトずつチェックして、自力で分解してください。
「123456789改行」は
標準的なDOSテキストファイル(Shift-JIS)なら
バイナリエディタで見て、
31 32 33 34 35 36 37 38 39 0d 0a
になっているはずです。
Sayさん、レスありがとうございます。
説明が下手で申し訳ありません。
09と0dは2バイトになっています。
テキストエディターで見るとその2バイトの、
ところは全角の記号になっています。
やはりバイナリでオープンして、1バイトずつ、
読込むしかないんですかね。
データ件数もあるので、処理時間が気になります。
他に効率的な方法てないんですかね。
何がしたいのか微妙にわかりませんが、
VBに改行を勝手に消去されないように読み込みたいということですか?
1レコードという定義が何を指すのかわかりませんが、例えば
InputやLine Inputで1回分読み込んだデータのことですか?
通常、レコードというとランダムアクセスでの用語なのですが、質問を見る限り
そんな気がしたので。
意味がよくわかりません。
>1234567890d0a ← バイナリエディタで見ると"9"と"0d:CR"が2バイト
>"9"と&H0dが2バイト(全角文字)に、なっているので
>09と0dは2バイトになっています。
「09が2バイト(全角文字)」とは「9」のことですか?
「0dが2バイト(全角文字)」とは何のことでしょう?
それとも16進表記で「09 0d」という2バイトコードの全角文字という意味ですか?
残念ながら、Shift JIS全角文字にそのようなコードはありえません。
(&H09は、コントロールコードのHT(水平タブ 即ち vbTab)を意味します。)
それ以前に文字コードは Shift JIS (JIS X 0208) なのでしょうか?
そもそも問題の文字列はバイナリエディタで見て16進表記でどう並んでますか?
レスをありがとうございます。
090dは書き方が間違っていました。810dだったと思います。
全角の記号です。
レコードは2レコードあるんですが1レコードの
ある全角文字コードが0dになっているんです。
そのためline inputで読込むと、
2レコード目の0d0aを1レコードの認識をしているみたいです。
VBの1レコード読込み時デバックで見るとこんな感じです。
1234567 ←改行されています。
12345 ← このデータは2レコードになっています(エディターで確認しました)
説明が下手で申し訳ありません。
0d0aじゃなくて0aで1行の認識を出来れば・・・
よろしくお願いします。
意味がよくわかりません。
>090dは書き方が間違っていました。810dだったと思います。
意味不明です。
少なくともShift JISには、その定義上「810d」というコードは存在しえません。
>ある全角文字コードが0dになっているんです。
意味不明です。
0dはコントロールコードのCR(キャリッジリターン)であって
全角コードではありません。
>1234567 ←改行されています。
意味不明です。
「7」のShift JISコードは「8256」です。「810d」ではありません。
>12345 ← このデータは2レコードになっています
意味不明です。
この「12345」という文字列をどう分解したら2レコードになるのかわかりません。
>0d0aじゃなくて0aで1行の認識を出来れば・・・
それで解決できるのなら、そのようにコーディングすればいいのでは?
質問を再掲します。
●それ以前に文字コードは Shift JIS (JIS X 0208) なのでしょうか?
●そもそも問題の文字列はバイナリエディタで見て16進表記でどう並んでますか?
意味不明の解説をするより、以上の質問に回答したほうが
問題解決につながると思いますが、
質問に対する回答がない以上、これ以上答えようがありません。
Sayさん、有難うございます。
説明が上手く出来なくて・・・
もう少し調べています。
いろいろとありがとうございました。
何とか解決しました。
説明が下手でも申し訳ありませんでした。
今後ともよろしくお願いします。