- ベストアンサー
Line Inputで文字化け(助けて下さい)
素人な質問ですみません。 Line Input #fpFileNo, strMsgBuffA 上記手法により、txtファイルから1行ずつレコードを 取り出していますが、 先頭が”全角文字”のレコードを取り出すと 先頭文字が”文字化け”します。 正しく全角文字が取り出せる手法を教えてください。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
ウィス! 今日は午後出社ダヨ 昨日は用事があって、きちんと最後まで説明できなかったダヨ。 Open strFile For Binary As #intFile Get #intFile, , bytBuff Close #intFile までは一緒 先頭から1~10バイトがShiftJIS 文字変数 = strconv(MIDB(bytBuff,1,10),vbunicode) 先頭から11~14バイトがバイナリ redim バイト変数(3) as byte バイト変数 = MIDB(bytBuff,11,4) これで先頭の一行の改行コード直前までの値を取得したことになる。 ついでにいうと先頭から15~16バイトが改行コード strconv(MIDB(bytBuff,15,2),vbunicode) = 改行コード(vbcrlf) だから17バイト目からXレコードが始まることになる。 Xレコードを取るためには MIDB(bytBuff,17,文字変数より取得したXレコード長) とすると取れるはず。 バイナリと言ってもいろいろあるので、どんなデータが入っているのかわからないから、キャストしやすいバイト変数をサンプルに挙げたけど、必要に応じて違う変数を宣言する必要あり。
その他の回答 (8)
- 2ch
- ベストアンサー率51% (64/125)
さっき乗せたbytBuffをMidBで必要な領域だけ引っこ抜いて、ShiftJIS情報だけStrConvで変換してやったらいい
補足
ありがとうございます。 いろいろ思考錯誤してみます。
- 2ch
- ベストアンサー率51% (64/125)
追伸:今日は定時6:30退社ズラ
- 2ch
- ベストアンサー率51% (64/125)
・1レコード毎の可変長 ・バイナリデータ、全角文字、半角カナを含む これだけじゃわからない。 「存在するかどうか」はもうわかっているので、 どういう法則で入っているかが必要。 バイナリデータの形式(レコードセットXMLなどなど) バイナリレコードは複数行数にわたって存在していて、各バイナリ情報の使用するバイト数が統一されていなければ、それらのバイナリ領域が何バイト存在しているかが、各レコードにヘッダが必要になる。(リソースファイルや圧縮ファイルのアルゴリズム) バイナリを読むためには、予め読む領域が得ていることが必須
補足
確かにおっしゃる通りで説明不足でした。 そこで 以下の例でレコードが存在していた場合についての ”限定”ではどうでしょうか。 1レコード目: 英数字(10バイト)+バイナリ(4バイト) Xレコード目: 英数字(?バイト) Yレコード目: 英数字(?バイト) Zレコード目: 全角文字(?バイト) 1は、バイナリ領域の存在位置/長さがわかる固定長 XYZは、英数字、全角文字が混在する可変長
- 2ch
- ベストアンサー率51% (64/125)
そもそも、そのデータは固定長? そうじゃなきゃ、バイナリで読むなんて、かえって面倒。 全部取得しちゃえば、何でも対応できる。 そもそもShift-JISと違って、バイナリに改行という概念は無い。 改行も単なる文字コード だからLine Input を使用する事自体に矛盾がある。 Dim intFile As Integer Dim lngLen As Long Dim bytBuff() As Byte Dim strFile As String Dim varWk As Variant Dim i As Long strFile = "C:\Test.txt" lngLen = FileLen(strFile) ReDim bytBuff(lngLen - 1) intFile = FreeFile Open strFile For Binary As #intFile Get #intFile, , bytBuff Close #intFile varWk = Split(StrConv(bytBuff, vbUnicode), vbCrLf) For i = LBound(varWk) To UBound(varWk) Debug.Print varWk(i) Next i
補足
TXT内の構成は、 ・1レコード毎の可変長 ・バイナリデータ、全角文字、半角カナを含む レコードもあり で、1レコード単位に処理したいのです。 このような場合、どうすればよろしいのでしょうか。
#2のゆんです。 ・・・何故、純粋に1行読みたい時にBinaryなんでしょう。。。(^-^; 1行を読み込んだ後に、Binaryでの処理があるから、とかであれば まずは、Open ファイル名 For Input Access Read As fpFileNo などで 開き、1行読み込んで処理してから、 再度Binaryで開くとかしたほうがいいように思います。
補足
#2のゆんさん。ありがとうございます。 読込むTXTファイル内には、バイナリデータが混在して いるため、このようなOpen方法にしています。 再Open時に発生するファイルptr操作を複雑にしたくなく、 なるべくOpenは、1回で済ませたかったのです。 やはり、扱うデータに合わせで再Openしなくては 実現できないのでしょうか。
- masa00
- ベストアンサー率40% (4/10)
下記のようにテストしたところ正しく取り出せました。 参考になるか解りませんが・・・ Dim sFileName As String Dim fpFileNo As Integer Dim strMsgBuffA As String Text1.Text = "" fpFileNo = FreeFile sFileName = CurDir & "\Test001.txt" Open sFileName For Input As #fpFileNo Do While Not EOF(fpFileNo) Line Input #fpFileNo, strMsgBuffA Text1.Text = Text1.Text & strMsgBuffA & vbCrLf Loop Close #fpFileNo
補足
すみません。 参考にさせていただきましたが Open sFileName For Binary As #fpFileNo では、やはりうまくいきませんでした。 For Binary でオープンした場合 Line Input では、だめなのでしょうか。
読み込んだ時(Line Inputした時)に既に化けてるんですか? 加工しようとしてMidやLeftなんかをした時に、ということではないんでしょうか?
補足
加工は、していません。 どうやら、OPEN時のモードが”バイナリ”で Line Inputで読込もうとしているのが原因かなと 思われます。ダンプしたら先頭の文字コードが不正 でした。 そこで、OPEN時のモードが”バイナリ”で 純粋に1行を読込みたい(改行まで)場合は、 どうすればよいのでしょう。
そのテキストファイルの文字コードがシフトJISでないのでは?
補足
残念ながら、シフトJISなのです。 ”半角+全角”のレコードは、読めますが ”全角+半角”のレコードが、文字化けしてます。
お礼
いろいろご指導ありがとうございました。 思考錯誤の結果、 Open ~ For Binary Get Close Open ~ For Input Line Input Close を使い分けした方法で実現しました。 大変助かりました。