NULLを0に変換


makoto  2002-11-30 01:04:58  No: 105547

みなさん、はじめまして。
VB6.0でファイルの取り込みをしたいのですが
NULLでひっかかっていて行き詰まってしまいました。

読み込みは1行単位で行っています。
ファイル形式は固定長です。
1行読み込んだたら
record = StrConv(record, vbFromUnicode)
で変換して
w_Date1 = Trim(StrConv(MidB(record, 1, 8), vbUnicode))
w_Yobi1 = Trim(StrConv(Midb(record, 9, 1), vbUnicode))
w_Date2 = Trim(StrConv(Midb(record,10, 8), vbUnicode))
のようにバイト数単位で読み込んでいます。

ここでrecordの中にNULLが入ってる場合
ex)20021129 20021130
    日付  ↑    日付


makoto  2002-11-30 01:08:40  No: 105548

すみません
間違えて送信してしまいました。
続きです。

日付と日付の間には曜日コードが入ります。
曜日コードに値がない場合NULLがはいっています。

しかし私のプログラムだと
w_Date1には"20021129"と正常に入りますが
w_Yobi1には空白が入って欲しいのに"2"が入ってしまいます。
w_Date2は"0021130"となっています。

NULLを空白として取り込むにはどうしたらいいのでしょうか?
アドバイスをお願いします。


とろ  2002-11-30 02:02:55  No: 105549

record = StrConv(record, vbFromUnicode)
の前に
record = Replace(record,vbNullchar, " ")
を入れてみてはどうですか?


makoto  2002-11-30 04:13:19  No: 105550

アドバイスありがとうございます。
Replaceを試してみましたがやはりダメでした。
1行読み込んだ時点で
NULLははじかれて、データがつめられているようです。
NULLも一緒に読み込むにはどうしたらいいのでしょうか?
質問が変わってきていますがよろしくお願いします。


所業無常  2002-12-02 04:12:10  No: 105551

正常なデータが判らないので力技(改行側からdate2を取るとか)も
判らんし、固定長のはずが固定長ではないので、良くわからんのですが...
#固定長なら、一行の文字列長を取っちゃえば良いと思うのだけど(w

strTmp = "20020101" & vbNullChar & "20020102"
strTmp = Replace(strTmp, vbNullChar, "*")
この時点でstrTmp = 20020101*20020102

置換できてます。ということはvbNullChar以外が入ってるって事ですよね?
vbNullCharで試されました?

strTmp = "20020101" & Null & "20020102
この時点で既に、strTmp は 2002010120020102
strTmp = Replace(strTmp, Null, "*")
この時点でstrTmp は 2002010120020102

MSDNから引用
>キーワードNull は、バリアント型 (Variant) の 1 つで、
>有効な値が変数に格納されていないことを示します。
VBでのNULLはこれです。vbNullCharはchr$(0)が示す0x00です。
試されると良いでしょう。

画面上20020101 20020102空白や化けた文字が表示されるのであれば、
*何らかの*コードが入ってます。
そこに入っている文字コード位自分で調べたほうが良いと思います。
TABとか入ってません?因みにvbTabでも置換できました。
一旦実験でbyte配列に落とすなり、Cで読んでみるなり色々。

もし本当にNULLで繋がっているのであれば、面倒だけども日付を示すワードが
含まれるか調べて(instr使えば簡単ですよね?)処理を分ければ良いと思いますが。


あんちゃん  2002-12-02 19:44:14  No: 105552

これで出きると思います。
w_Date1 = Iif(Trim(StrConv(MidB(StrConv(record, vbFromUnicode), 1, 8), vbUnicode))<>"",Trim(StrConv(MidB(StrConv(record, vbFromUnicode), 1, 8), vbUnicode)),vbNullString)
w_Yobi1 = Iif(Trim(StrConv(MidB(StrConv(record, vbFromUnicode), 9, 1), vbUnicode))<>"",Trim(StrConv(MidB(StrConv(record, vbFromUnicode), 9, 1), vbUnicode)),vbNullString)
w_Date2 = Iif(Trim(StrConv(MidB(StrConv(record, vbFromUnicode), 10, 8), vbUnicode))<>"",Trim(StrConv(MidB(StrConv(record, vbFromUnicode), 10, 8), vbUnicode)),vbNullString)


あんちゃん  2002-12-02 20:23:54  No: 105553

戻り値を変える場合は、vbNullStringを変更してください。
この場合は、空の文字列を返しています。

あと、可変長ではなく固定長のデータですので間違わないように。


makoto  2002-12-02 23:35:54  No: 105554

みなさん、アドバイスありがとうございます。

Line Input #FileNumber, record
このように1行読み込みを行っているのですが
ここで読み込んだ時点でNULLがはじかれてしまってます。
recordの中は「2002112920021130」になっています。
なのでisNullにもひっかかってくれません。

NULLも一緒に読み込むのにはどうしたらよいのでしょうか?


とろ  2002-12-03 00:27:28  No: 105555

あなたの言う Null に誤解があるみたいですね。
データベースなどから Null を読み込んで、
テキストファイルなどに出力すると Null は消えてしまいますよ。
そのファイルから Null を読み込みたいと言っても、無理です。

つまり、テキストファイルから読み込む時に
Null も読み込みたいとあなたは言っていますが、
恐らく、テキストファイル自体に既に
Null がなくなってしまっていると思われます。

それなので、テキストファイルを作成する側を
修正しなければなりません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加