久々にバッチVBSのお仕事

「テキストデータ内の特定の条件に合致するレコードを除去して再テキスト化して欲しい。」

・・・なんて依頼を受けてしまった。
そのテキストデータをシステムに取り込む際、余分なデータは排除したいらしい。そんなのそのシステムの開発者に言えばいいのに・・・って、はいはい予算ですね。

まあ、エクセルのVBAで取り込んで除去して吐き出し直せばいいやって思って中を見てみたんだけど

・・・固定長でやんの・・・

さて困った。可変長だとばっかり思ってたので

1:エクセルに取り込む
2:要らんレコードをフィルタリングで除外する
3:その上で再度出力する

ってのを考えてて、15分くらいで終わるだろうと思ってたんだけど……
いや、取り込むのは対したこと無いんだけど、出力がね……。ファイルレイアウト通りに各セルをスペース補填やら前ゼロやらしてあげないといけないし、1レコードの項目数が70近くあるので、そんなにソース内に項目定義作るのもやってらんない。

・・・こりゃ、テキストデータ内を直接調べて、除外したくないレコードだけを随時別のテキストファイルにまるごと書き出す方が楽だし安全だな。(コーディングミスって下手にバイトずれでもしたら目も当てられないし)
だったらいちいちエクセルも起動させないで、VBSファイルをダブルクリックする方が、使うほうも楽よねぇ(ファイルパス固定だし)

ってことで、

1:ファイル開く
2:1レコードを読む
3:除外条件となる特定のバイト目を調べる
4:除外条件でなければ、別のテキストデータに書き出し
5:次のレコードを読む(以降3〜5繰り返し)
6:最後に、元のファイルを別の場所に置き、新たに書き出したファイルを元のファイルにリネームでおk

うん、これならたいした時間も食わんだろう。

・・・と思ったんですけどねぇ・・・
途中に全角文字入ってるの忘れてた。3の処理をやるのに、単純にMid関数じゃダメだ。とはいえ、テキストデータがシフトJISなので、MidB関数も使えない。えーっと確か、別件でバイト数をカウントする処理を作るのに同じ問題にぶち当たったよなぁ・・・あのスクリプトどこに行ったかなぁ・・・そっからコピーして作り直せば問題ないよなぁ・・・

って、探すのに1時間かかってしまったorz
エクセルで取り込んで固定長で吐き出すやり方より時間かかっとるんじゃなかろーか・・・まあ、レコード丸写しの方が精神的には楽だからいいけど。

まあ、取り敢えず見つかったスクリプトを抜き出して、関数化して動作確認してと・・・あーできたできた。ほんと固定長嫌い。

なお、シフトJISのバイト数変換は、Left関数で左から1文字ずつ調べていき、その1文字が1バイトか2バイトかを判定し、その結果を累積していけば良い。
1バイトか2バイトかの判定は、アスキー変換したその文字に対して0xFF00で論理積をとれば、それが1バイトだったら論理積は0、2バイトだったら0以外になることで判別できる。

If Asc(その文字) And &HFF00 = 0 Then
その文字のバイト数 = 1
Else
その文字のバイト数 = 2
End If

的な(まともに書け)