こんばんは。
今日は自作のプログラムを紹介します。
1.速くてお手軽なVBScriptが好きです。
会社のデスクに、大量のVBScriptのツールが入っています。
ファイルの内容確認や、項目単位でのマッチングなど。
Excelのマクロで更に高度な処理が可能ですが、VBScriptとテキストファイルの組み合わせは、自分でいろいろ工夫ができるし、処理も高速で処理が止まるストレスもないし(データが多かったり、ループすれば別です!)、ソフトのインストールも必要なくwindowsパソコンがあればすぐ始められるし、個人的には最高のツールです。
無印良品が、テキストファイルをデータベース代わりにbashでシステムを運用(しかも内製)していると聞き、何か近しい事ができないかなあと模索したところ、この手法にたどり着き、ほぼ10年愛用しています。
Shift-Jis対応のため、win10でUTF-8標準になってからはファイル保存にUTF-8をいちいち選択したりと面倒になっていますが、それでも現役です。
さて、今回はCSVファイルの特定の文字列を抽出するプログラムをご紹介します。
・時代に逆行してShift-Jis専用です・・。
・","の中を変更すれば、CSV以外でも使えます(タブに変更すればtabファイルでも可能)。
2.プログラム
itemget.vbs
Function item(rec,itemno)
'取得項目格納先
item = ""
'タブ取得数
tabcnt = 0
' "0" : 未取得 "1":取得中 "2":取得済
status = "0"
for i = 1 to 10000
lett = Mid(rec,i,1)
'itemnoが'1'の時(1項目目を取得したいとき)は、最初からstatusを"1"にする。
if itemno = 1 and tabcnt = 0 then
status = "1"
else
end if
'取得文字が区切り文字だったとき、ステータスを変更する。
if lett = "," then
tabcnt = tabcnt + 1
if CInt(itemno) = CInt(tabcnt+1) then
status = "1"
else
if CInt(itemno) > CInt(tabcnt+1) then
'itemno > tabcnt +1 の場合 (項目番号よりも取得タブ+1が小さい場合)、statusを"0"とする
status = "0"
else
'itemno < tabcnt +1 の場合 (項目番号よりも取得タブ+1が大きい場合)、statusを"2"とする
status = "2"
end if
end if
else
'取得文字が区切り文字でない時、status:1(取得中)の時は文字列を連結する。
if status = "1" then
item = item & lett
else
end if
end if
'status:2の時は処理を終了させる。
if status = "2" then
i = 10001
else
end if
next
end Function
3.使い方
「item(rec,itemno)」の値はそれぞれ以下の意味になります。
item:戻り値
rec:対象レコード
itemno:取得したい項目の番目
下記のように呼び出します(レコード:inputtの5番目の文字列を取得して、MSG出力)。
ここには文字列を直接指定していますが、好きなCSVファイルを読み込んで使ってみてください。
inputt = "a1,b2,c3,d4,e5,f6,g7,h8,i9,j0"
msgbox(item(inputt,5))
これを色々なマクロで活用しています。
・CSVファイル同士のキーマッチング(Aファイルのx項目目と、Bファイルのxx項目目を比較)
・xx項目目の数値項目を集計
4.さいごに
記事に書くために、適当だった項目名を修正したり、インデントをきれいにしました。
作品を発表する気分です。
用途は限られますが、良かったら使ってみてください!