アルゴリズム
データベース
テキスト
vbs

テキストファイルをvbsプログラムで操作する。

More than 1 year has passed since last update.

 DOS環境でFDにギギギッといわせてテキストデータを読み書きしていた世代としては、現代のフレームワーク操作やデザインパターンの適用などは正直言って難しすぎます。

 レトロ感覚で、自分の習作のテキストデータ処理のプログラムを引っ張り出してきました。

まず、操作対象のテキストデータです。

データ1 現金出納帳ファイル(取引番号順)

取引番号
日 付
取引コード
貸借区分
金 額

0010
20090409
1010
1
20000000

0020
20090417
5040
2
50000

0030
20090415
5010
2
1200000

0040
20090501
4020
1
160000

0050
20090620
5040
2
70000

0060
20091022
4010
1
800000

0070
20091108
5010
2
620000

0080
20091224
5010
1
31000

0090
20100106
1010
2
240000

0100
20100323
4010
1
780000

データ2 現金出納帳ファイル(取引コード順)

取引番号
日 付
取引コード
貸借区分
金 額

0010
20090409
1010
1
20000000

0090
20100106
1010
2
240000

0060
20091022
4010
1
800000

0100
20100323
4010
1
780000

0040
20090501
4020
1
160000

0030
20090415
5010
2
1200000

0070
20091108
5010
2
620000

0080
20091224
5010
1
31000

0020
20090417
5040
2
50000

0050
20090620
5040
2
70000

データ3 取引マスタファイル

取引コード
取引内容

1001
現金

1010
当座預金

1030
売掛金

2010
借入金

4010
売上

4020
受取手数料

5010
仕入

5040
保険料

データ4 更新ファイル

更新区分
取引番号
日 付
取引コード
貸借区分
金 額

1
0020
20090417
5040
2
900000

1
0040
20090501
1030
1
160000

2
0050
20090620
5040
2
70000

3
0061
20091101
4010
2
80000

3
0070
20091130
1010
1
50000

1
0077
20091224
5010
1
30000

2
0080
20091224
5010
1
31000

3
0091
20100203
2010
1
570000

以上の表のテキストデータ

1 現金出納帳ファイル(取引番号順)


cash-jnl1.txt

0010,19980409,1010,1,020000000

0020,20090417,5040,2,000050000
0030,20090415,5010,2,001200000
0040,20090501,4020,1,000160000
0050,20090620,5040,2,000070000
0060,20091022,4010,1,000800000
0070,20091108,5010,2,000620000
0080,20091224,5010,1,000031000
0090,20100106,1010,2,000240000
0100,20100323,4010,1,000780000

2 現金出納帳ファイル(取引コード順)


cash-jnl2.txt

0010,20090409,1010,1,020000000

0090,20100106,1010,2,000240000
0060,20091022,4010,1,000800000
0100,20100323,4010,1,000780000
0040,20090501,4020,1,000160000
0030,20090415,5010,2,001200000
0070,20091108,5010,2,000620000
0080,20091224,5010,1,000031000
0020,20090417,5040,2,000050000
0050,20090620,5040,2,000070000


3 取引マスタファイル


ac.txt

1001,現金

1010,当座預金
1030,売掛金
2010,借入金
4010,売上
4020,受取手数料
5010,仕入
5040,保険料


4 更新ファイル


cash-kousin1.txt

1,0020,20090417,5040,2,000900000

1,0040,20090501,1030,1,000160000
2,0050,20090620,5040,2,000070000
3,0061,20091101,4010,2,000080000
3,0070,20091130,1010,1,000050000
1,0077,20091224,5010,1,000030000
2,0080,20091224,5010,1,000031000
3,0091,20100203,2010,1,000570000


データの一覧表表示プログラム


cash-jnl-syuturyoku1.vbs

Option Explicit

Dim FileObj,TorihikiObj
Dim endsw
Dim suu
'
Dim torihikirec,recobun
Dim torihikiban,hizuke,kanjouban,karikasikubun,kingaku
'
Dim hyoujibun

Set FileObj=CreateObject("Scripting.FileSystemObject")
Set TorihikiObj=FileObj.OpenTextFile("cash-jnl1.txt")
endsw=0
suu=0
hyoujibun="番号 日 付  勘定 入出  金 額" & vbCrLf

While endsw=0
torihikirec=TorihikiObj.ReadLine()
if TorihikiObj.AtEndOfStream = True then
endsw=1
else
recobun=""
recobun="取引番号:  "&mid(torihikirec,1,4)&vbCrLf
recobun=recobun&"日 付: "&mid(torihikirec,6,8)&vbCrLf
recobun=recobun&"勘定番号:  "&mid(torihikirec,15,4)&vbCrLf
recobun=recobun&"入出区分:   "&mid(torihikirec,20,1)&vbCrLf
recobun=recobun&"金  額: "&mid(torihikirec,22,9)
msgbox recobun,, "取引レコード内容"

torihikiban=CInt(mid(torihikirec,1,4))
hizuke=mid(torihikirec,6,8)
kanjouban=CInt(mid(torihikirec,15,4))
karikasikubun=CInt(mid(torihikirec,20,1))
kingaku=CLng(mid(torihikirec,22,9))
hyoujibun=hyoujibun &" "& torihikiban&" "&hizuke&" "&kanjouban&"  "&karikasikubun&" "& Space(14-len(CStr(kingaku))*1.5) & CStr(kingaku) & vbCrLf
' msgbox torihikiban&" "&hizuke&" "&kanjouban&" "&karikasikubun&" "&kingaku,, "取引レコード内容"
suu=suu+1
end if
wend
msgbox hyoujibun,, "取引記録ファイル内容"
msgbox suu&"件",,"レコード件数"
TorihikiObj.Close()


取引コードから取引名を線形探索で探し出して表示するコード


cash-senkeitansaku-syuturyoku1.vbs

Option Explicit

Dim FileObj,AcMstObj,TorihikiObj
Dim i,endsw
Dim AcCd(100),AcMei(100),AcSuu,AcMeiO
Dim suu,zandaka
Dim moji,c,j
'
Dim Acrec,torihikirec,recobun
Dim torihikiban,hizuke,kanjouban,karikasikubun,kingaku
'
Dim hyoujibun

Set FileObj=CreateObject("Scripting.FileSystemObject")

Set AcMstObj=FileObj.OpenTextFile("ac-mst.txt")
endsw=0
i=1
While endsw=0
Acrec=AcMstObj.ReadLine()
if AcMstObj.AtEndOfStream = True then
endsw=1
else
AcCd(i)=CInt(mid(Acrec,1,4))
AcMei(i)=mid(Acrec,6,20)
' msgbox AcCd(i) &" " & AcMei(i) ,, "勘定科目マスタ内容"
end if
i = i + 1
wend
AcSuu=i-1
AcMstObj.Close()
'msgbox "acsuu=" & Acsuu
Set TorihikiObj=FileObj.OpenTextFile("cash-jnl1.txt")
endsw=0
suu=0
zandaka=0

hyoujibun="番号 日 付   勘 定 入出  金 額  残 高" & vbCrLf
While endsw=0
torihikirec=TorihikiObj.ReadLine()
if TorihikiObj.AtEndOfStream = True then
endsw=1
else
' call rec1out
torihikiban=CInt(mid(torihikirec,1,4))
hizuke=mid(torihikirec,6,8)
kanjouban=CInt(mid(torihikirec,15,4))
karikasikubun=CInt(mid(torihikirec,20,1))
kingaku=CLng(mid(torihikirec,22,9))
if karikasikubun=1 then
zandaka = zandaka + kingaku
else
zandaka = zandaka - kingaku
end if

AcMeiO = AcTansaku1(kanjouban)
' MsgBox LenSJIS(AcMeiO)
hyoujibun=hyoujibun &" "& torihikiban&" "&hizuke&" "&AcMeiO&Space((30-LenSJIS(AcMeiO)*1.5))&"  " _
& karikasikubun&" "& Space(14-len(CStr(kingaku))*1.5)&CStr(kingaku) _
& Space(14-len(CStr(zandaka))*1.5)&CStr(zandaka) & vbCrLf
' msgbox torihikiban&" "&hizuke&" "&kanjouban&" "&karikasikubun&" " & kingaku & " " & zandaka,, "取引レコード内容"
suu=suu+1
end if
wend
msgbox hyoujibun,, "取引記録ファイル内容"
' msgbox suu&"件",,"レコード件数"
TorihikiObj.Close()
Set TorihikiObj=Nothing
Set FileObj=Nothing

Sub rec1out
recobun=""
recobun="取引番号:  "&mid(torihikirec,1,4)&vbCrLf
recobun=recobun&"日 付: "&mid(torihikirec,6,8)&vbCrLf
recobun=recobun&"勘定番号:  "&mid(torihikirec,15,4)&vbCrLf
recobun=recobun&"入出区分:   "&mid(torihikirec,20,1)&vbCrLf
recobun=recobun&"金  額: "&mid(torihikirec,22,9)
msgbox recobun,, "取引レコード内容"
End Sub

Function AcTansaku1(AcCd2)
i=1
' msgbox "i="&i&" Acsuu="&Acsuu
While AcCd(i) <> AcCd2 And i <= Acsuu
i = i + 1
Wend

If i <= Acsuu Then
AcTansaku1=AcMei(i)
Else AcTansaku1=" * 科目見当たらず * "
End If
' msgbox AcTansaku1
End Function

Function LenSJIS(moji)
j=0
For i=1 to Len(moji)
c=Mid(moji,i,1)
If (Asc(c) And &HFF00) = 0 Then
j=j+1
Else
j=j+2
End If
Next
LenSJIS=j
End Function


更新ファイルを使って、新取引ファイルを出力するコード


cash-jnl-kousin1.vbs

Option Explicit

Dim FileObj,CashObj,TCashObj,NCashObj
Dim endsw
Dim suu
'
Dim CashRec,TCashRec,recobun
Dim CashNo,CashDate,CashAccd,CashFlg,CashKingaku
Dim TCashKubun,TCashNo,TCashDate,TCashAccd,TCashFlg,TCashKingaku
Dim NCashNo,NCashDate,NCashAccd,NCashFlg,NCashKingaku
'
Dim hyoujibun

Set FileObj=CreateObject("Scripting.FileSystemObject")
Set CashObj=FileObj.OpenTextFile("cash-jnl1.txt")
Set TCashObj=FileObj.OpenTextFile("cash-kousin1.txt")
Set NCashObj=FileObj.CreateTextFile("cash-jnl-new.txt")
CashNo=0
TCashNo=0

Torihiki1Yomu
Kousin1Yomu

While CashNo<9999 Or TCashNo<9999
If CashNo < TCashNo then
' 元のままのデータ吐き出し処理
NCashObj.Write CashRec&vbCrLf
Torihiki1Yomu
Else
If CashNo > TCashNo Then
' 新データ追加の処理
If TCashKubun <> 3 Then
MsgBox "追加データエラー 内容:" & TCashRec
Else
NCashObj.Write Mid(TCashRec,3,32)&vbCrLf
End If
Kousin1Yomu
Else
' データ更新の処理
If TCashKubun = 1 Then
NCashObj.Write Mid(TCashRec,3,32)&vbCrLf
Torihiki1Yomu
Kousin1Yomu
Else
If TCashKubun = 2 Then
' データ削除の処理
Kousin1Yomu
Else
MsgBox "更新データエラー 内容:" & TCashRec
Kousin1Yomu
End If
End If
End If
End If
wend
msgbox hyoujibun,, "取引記録ファイル内容"
msgbox suu & "件" ,,"レコード件数"
NCashObj.Write vbCrLf
CashObj.Close()

Sub Torihiki1Yomu
CashRec=CashObj.ReadLine()
if CashObj.AtEndOfStream = True then
CashNo=9999
else
CashNo=CInt(mid(CashRec,1,4))
CashDate=mid(CashRec,6,8)
CashAccd=CInt(mid(CashRec,15,4))
CashFlg=CInt(mid(CashRec,20,1))
CashKingaku=CLng(mid(CashRec,22,9))
' msgbox CashNo&" "&CashDate&" "&CashAccd&" "&CashFlg&" "&CashKingaku,, "元の取引レコード内容"
suu=suu+1
end if
End Sub

Sub Kousin1Yomu
TCashRec=TCashObj.ReadLine()
if TCashObj.AtEndOfStream = True then
TCashNo=9999
else
TCashKubun=CInt(mid(TCashRec,1,1))
TCashNo=CInt(mid(TCashRec,3,4))
TCashDate=mid(TCashRec,8,8)
TCashAccd=CInt(mid(TCashRec,17,4))
TCashFlg=CInt(mid(TCashRec,22,1))
TCashKingaku=CLng(mid(TCashRec,24,9))
' msgbox TCashKubun&" "&TCashNo&" "&TCashDate&" "&TCashAccd&" "&TCashFlg&" "&TCashKingaku,, "更新レコード内容"
suu=suu+1
end if
End Sub


更新後に吐き出されるファイル


cash-jnl-new.txt

0010,19980409,1010,1,020000000

0020,20090417,5040,2,000900000
0030,20090415,5010,2,001200000
0040,20090501,1030,1,000160000
0050,20090620,5040,2,000070000
0060,20091022,4010,1,000800000
0061,20091101,4010,2,000080000
0070,20091108,5010,2,000620000
0080,20091224,5010,1,000031000
0090,20100106,1010,2,000240000
0091,20100203,2010,1,000570000
0100,20100323,4010,1,000780000


 磁気テープや穿孔カード等が主流の古き良き時代のプログラミングは不可逆なテキストファイルを操作していくシステムが当然でした。

 今のRDBやNoSQLでビッグデータを操るシステムとは一昔も二昔も古いテクニックです。

 鉄腕アトムやスタートレックでも、コンピュータは磁気テープやプラウン管で描かれていました。ペリーローダンが宇宙人の侵略から地球を防衛するために、防衛プログラムの打ち込まれた穿孔カードをOMRに投入する描写があったりしました。

 これからもどこまで進歩していくのやら見当もつきません。