LoginSignup
0
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-17

 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に投入する描写があったりしました。
 これからもどこまで進歩していくのやら見当もつきません。

0
1
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
1