0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【VBScript】CSVの文字列から、任意(x番目)の項目を取り出す

Last updated at Posted at 2021-02-28

こんばんは。
今日は自作のプログラムを紹介します。

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.さいごに

記事に書くために、適当だった項目名を修正したり、インデントをきれいにしました。
作品を発表する気分です。
用途は限られますが、良かったら使ってみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?