• ベストアンサー

ファイルの読み込みについて

いつもお世話になっています。 早速質問なのですが、VBのファイル処理において固定長データのテキストファイル読み込みの処理で、 固定長データの改行コードがChr(10)になっているデータがあります。 下記のどのOpenステートメントを使用しても、1行読み込みではなく全行読み込まれてしまうのです。 ↓ファイルモード (1)Open strInFile For Input As #intInFile (2)Open strInFile For Random As #intInFile Len=文字数 (3)Open strInFile For Binary As #intInFile ちなみに読み込みのモードは ・Line Input ステートメント ・Get ステートメント の2つを使用してみました。 改行コードの種類に依存せずにデータを1行読み込む方法を教えていただきたいです。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.1

内容がテキスト(文字)のシーケンシャルファイルは、メモ帳では aaaa bbbbbbb cc ddddd などと表示して見せられるので、aaaa、bbbbbbb、cc、ddddd が千切れてあるように、イメージし勝ちですが、実は aaaa+vbcrlf+bbbbbbb+vbcrlf+cc+vbcrlf+ddddd と繋がった、「ヒモ」のようなものです。MSDOSのファイル形式を受け継ぐものです。Unixなどは違うようです。vbcrlfはCHR(10)+CHR(13)の2バイト。 このvbcrlfが本質問ではChr(10)(vbCr)だけになったわけです。 メモ帳で aaaaaa・bbbbbb・ccccc・sss・dddddd・fffff・ggggg・ hhhhhh (・はChe(10)のメモ帳上の文字表示状態を似せたもの。) を作りました。(注。上記の・は全角の中点ですからコピー貼り付けでデータとして使わないこと。) Sub test02() Open "c:\My Documents\txt11.txt" For Input As #1 Input #1, x s = 1 p = Split(x, Chr(10)) For i = 0 To UBound(p) MsgBox p(i) Next i End Sub を実行すると、順次画面表示されます。Split関数を使っています。 このMsgBox p(i)を y=p(i)と変数に入れて、あと好きなように処理してください。 レコード長、レコード数が極端に多くなければ、このやり方で良いでしょう。

guruguru2
質問者

お礼

早速の回答ありがとうございます。 実は上記のやり方も考えたのですが、今回はChr(10)の改行コードのデータでしたが、今後もChr(10)で来るとは限らないものでして…。 改行コードの種類に依存しない方法がありましたらお願い致します。

その他の回答 (2)

  • grace2973
  • ベストアンサー率66% (16/24)
回答No.3

「1行読み込む」のは、Line Input しかないと思います。 しかし、これは Chr(13) (vbCr) を検出して読み込むものです。 従って、改行コードの種類に依存せずに1行読み込むことはできません。 解決策としては 1.ファイルを cr + lf に変換してから使う。 2.自分で改行コードを検索して分割する。 しかないと思います。 入力ファイルの改行コードを変換してから使えるのであれば Line Input で良いでしょう。 改行コード変換ツールは vector等で探せば見つかります。 自分で改行コードを検索するやり方の場合は 読み込んだ文字列から InStr関数で検索できます。 ちなみに改行コードの種類としては Chr(10) (vbLf) のみ Chr(13) + Chr(10) (vbCr + vbLf) Chr(13) (vbCr) のみ の3種類あると思います。 ですので vbCrがあれば、そこまでが1行。  次の1バイトがvbLfだったらその次のバイトから次の行。  次の1バイトがvbLfでなければ、そこから次の行。 vbCrがなければ、vbLfを探す。  vbLfがあれば、そこまでが1行。次のバイトから次の行。  vbLfがなければ、その文字列には改行がない。 といった感じになると思います。

guruguru2
質問者

お礼

とても丁寧にありがとうございます。 参考にさせていただきます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

#1のお礼について。 p = Split(x, Chr(10)) では一例として、Chr(10)を使っているが、Chr(10)のところを、Chr(xx)に変えるとか文字列"yy"に置換えて考えてください。 それぐらいは想像して、出来るか出来ないかやって見てくださいよ。 あとinput\(20,#1)のような、桁長指定で読みこむステートメントがあります(Dos時代からの引き続き)。 この読みこんだ文字列の中に、レコード区切り文字がないか、Instr関数で探すとか、どうでしょう。 次ぎのinput\(20,#1)で、21バイト目から20バイト読んでくれると思いますが、あまり使ったことなし。

guruguru2
質問者

お礼

ありがとうございます。 実施してみます。