• ベストアンサー

Line Inputで文字化け(助けて下さい)

素人な質問ですみません。 Line Input #fpFileNo, strMsgBuffA 上記手法により、txtファイルから1行ずつレコードを 取り出していますが、 先頭が”全角文字”のレコードを取り出すと 先頭文字が”文字化け”します。 正しく全角文字が取り出せる手法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.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レコード長) とすると取れるはず。 バイナリと言ってもいろいろあるので、どんなデータが入っているのかわからないから、キャストしやすいバイト変数をサンプルに挙げたけど、必要に応じて違う変数を宣言する必要あり。

yone15
質問者

お礼

いろいろご指導ありがとうございました。 思考錯誤の結果、 Open ~ For Binary Get Close Open ~ For Input Line Input Close を使い分けした方法で実現しました。 大変助かりました。

その他の回答 (8)

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.8

さっき乗せたbytBuffをMidBで必要な領域だけ引っこ抜いて、ShiftJIS情報だけStrConvで変換してやったらいい

yone15
質問者

補足

ありがとうございます。 いろいろ思考錯誤してみます。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.7

追伸:今日は定時6:30退社ズラ

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.6

・1レコード毎の可変長 ・バイナリデータ、全角文字、半角カナを含む これだけじゃわからない。 「存在するかどうか」はもうわかっているので、 どういう法則で入っているかが必要。 バイナリデータの形式(レコードセットXMLなどなど) バイナリレコードは複数行数にわたって存在していて、各バイナリ情報の使用するバイト数が統一されていなければ、それらのバイナリ領域が何バイト存在しているかが、各レコードにヘッダが必要になる。(リソースファイルや圧縮ファイルのアルゴリズム) バイナリを読むためには、予め読む領域が得ていることが必須

yone15
質問者

補足

確かにおっしゃる通りで説明不足でした。 そこで 以下の例でレコードが存在していた場合についての ”限定”ではどうでしょうか。 1レコード目: 英数字(10バイト)+バイナリ(4バイト) Xレコード目: 英数字(?バイト) Yレコード目: 英数字(?バイト) Zレコード目: 全角文字(?バイト) 1は、バイナリ領域の存在位置/長さがわかる固定長 XYZは、英数字、全角文字が混在する可変長

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.5

そもそも、そのデータは固定長? そうじゃなきゃ、バイナリで読むなんて、かえって面倒。 全部取得しちゃえば、何でも対応できる。 そもそも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

yone15
質問者

補足

TXT内の構成は、 ・1レコード毎の可変長 ・バイナリデータ、全角文字、半角カナを含む レコードもあり で、1レコード単位に処理したいのです。 このような場合、どうすればよろしいのでしょうか。

noname#11856
noname#11856
回答No.4

#2のゆんです。 ・・・何故、純粋に1行読みたい時にBinaryなんでしょう。。。(^-^; 1行を読み込んだ後に、Binaryでの処理があるから、とかであれば まずは、Open ファイル名 For Input Access Read As fpFileNo などで 開き、1行読み込んで処理してから、 再度Binaryで開くとかしたほうがいいように思います。

yone15
質問者

補足

#2のゆんさん。ありがとうございます。 読込むTXTファイル内には、バイナリデータが混在して いるため、このようなOpen方法にしています。 再Open時に発生するファイルptr操作を複雑にしたくなく、 なるべくOpenは、1回で済ませたかったのです。 やはり、扱うデータに合わせで再Openしなくては 実現できないのでしょうか。

  • masa00
  • ベストアンサー率40% (4/10)
回答No.3

下記のようにテストしたところ正しく取り出せました。 参考になるか解りませんが・・・  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

yone15
質問者

補足

すみません。 参考にさせていただきましたが Open sFileName For Binary As #fpFileNo では、やはりうまくいきませんでした。 For Binary でオープンした場合 Line Input では、だめなのでしょうか。

noname#11856
noname#11856
回答No.2

読み込んだ時(Line Inputした時)に既に化けてるんですか? 加工しようとしてMidやLeftなんかをした時に、ということではないんでしょうか?

yone15
質問者

補足

加工は、していません。 どうやら、OPEN時のモードが”バイナリ”で Line Inputで読込もうとしているのが原因かなと 思われます。ダンプしたら先頭の文字コードが不正 でした。 そこで、OPEN時のモードが”バイナリ”で 純粋に1行を読込みたい(改行まで)場合は、 どうすればよいのでしょう。

noname#4564
noname#4564
回答No.1

そのテキストファイルの文字コードがシフトJISでないのでは?

yone15
質問者

補足

残念ながら、シフトJISなのです。 ”半角+全角”のレコードは、読めますが ”全角+半角”のレコードが、文字化けしてます。

関連するQ&A