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

　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

```

　磁気テープや穿孔カード等が主流の古き良き時代のプログラミングは不可逆なテキストファイルを操作していくシステムが当然でした。
　今のＲＤＢやＮｏＳＱＬでビッグデータを操るシステムとは一昔も二昔も古いテクニックです。
　鉄腕アトムやスタートレックでも、コンピュータは磁気テープやプラウン管で描かれていました。ペリーローダンが宇宙人の侵略から地球を防衛するために、防衛プログラムの打ち込まれた穿孔カードをＯＭＲに投入する描写があったりしました。
　これからもどこまで進歩していくのやら見当もつきません。