dポイントプレゼントキャンペーン実施中!

素人な質問ですみません。

Line Input #fpFileNo, strMsgBuffA

上記手法により、txtファイルから1行ずつレコードを
取り出していますが、
先頭が”全角文字”のレコードを取り出すと
先頭文字が”文字化け”します。

正しく全角文字が取り出せる手法を教えてください。

A 回答 (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レコード長)
とすると取れるはず。

バイナリと言ってもいろいろあるので、どんなデータが入っているのかわからないから、キャストしやすいバイト変数をサンプルに挙げたけど、必要に応じて違う変数を宣言する必要あり。
    • good
    • 1
この回答へのお礼

いろいろご指導ありがとうございました。
思考錯誤の結果、

Open ~ For Binary
Get
Close

Open ~ For Input
Line Input
Close

を使い分けした方法で実現しました。
大変助かりました。

お礼日時:2003/06/18 17:27

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

この回答への補足

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

補足日時:2003/06/18 09:44
    • good
    • 2

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

    • good
    • 0

・1レコード毎の可変長


・バイナリデータ、全角文字、半角カナを含む
これだけじゃわからない。

「存在するかどうか」はもうわかっているので、
どういう法則で入っているかが必要。
バイナリデータの形式(レコードセットXMLなどなど)
バイナリレコードは複数行数にわたって存在していて、各バイナリ情報の使用するバイト数が統一されていなければ、それらのバイナリ領域が何バイト存在しているかが、各レコードにヘッダが必要になる。(リソースファイルや圧縮ファイルのアルゴリズム)

バイナリを読むためには、予め読む領域が得ていることが必須

この回答への補足

確かにおっしゃる通りで説明不足でした。
そこで
以下の例でレコードが存在していた場合についての
”限定”ではどうでしょうか。

1レコード目: 英数字(10バイト)+バイナリ(4バイト)
Xレコード目: 英数字(?バイト)
Yレコード目: 英数字(?バイト)
Zレコード目: 全角文字(?バイト)

1は、バイナリ領域の存在位置/長さがわかる固定長
XYZは、英数字、全角文字が混在する可変長

補足日時:2003/06/17 18:16
    • good
    • 0

そもそも、そのデータは固定長?


そうじゃなきゃ、バイナリで読むなんて、かえって面倒。

全部取得しちゃえば、何でも対応できる。

そもそも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レコード単位に処理したいのです。
このような場合、どうすればよろしいのでしょうか。

補足日時:2003/06/17 17:53
    • good
    • 0

#2のゆんです。



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

この回答への補足

#2のゆんさん。ありがとうございます。

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

補足日時:2003/06/17 17:37
    • good
    • 0

下記のようにテストしたところ正しく取り出せました。


参考になるか解りませんが・・・

 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 では、だめなのでしょうか。

補足日時:2003/06/17 17:27
    • good
    • 0

読み込んだ時(Line Inputした時)に既に化けてるんですか?


加工しようとしてMidやLeftなんかをした時に、ということではないんでしょうか?

この回答への補足

加工は、していません。

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

補足日時:2003/06/17 17:01
    • good
    • 1

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

この回答への補足

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

補足日時:2003/06/17 16:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています