【VBScript】可変長ファイル:CSV(カンマ区切り)の一部データをマスクするツール

■可変長ファイル

可変長ファイルとは、固定長ファイルとは異なり、1行の長さが不定のデータファイルである。
可変長ファイルにおいて、一般的にデータとデータの境に区切り文字(「 ,」カンマなど)を設定することで、一つ一つのデータを区別する。

■可変長ファイル:CSV(カンマ区切り)のイメージ

可変長ファイルの例を示す。

▼sample_data.csv

1,20200105,1
2,20200104,123456789,0,241,12345678901
2,20200103,123456788,1,2000,12345678902
2,20200101,123456787,0,65441,12345678903
9,3

▼固定長ファイルのレイアウト

一般的に固定長ファイルを扱う場合は、固定長ファイルに対応するファイルレイアウトが存在する。

上記「 sample_data.csv」のファイルレイアウトは以下の通り

▼ヘッダー行のレイアウト

項目概要
レコード区分値が「1」の場合はヘッダーレコード
日付YYYYMMDD形式
曜日1:日曜日
2:月曜日
3:火曜日
4:水曜日
5:木曜日
6:金曜日
7:土曜日

▼データ行のレイアウト

項目概要
レコード区分値が「2」の場合はデータレコード
利用日YYYYMMDD形式(データを作成した日)
会員番号利用者の会員番号
利用金額フラグ「0」ならプラス。「1」ならマイナス
利用金額利用金額(未使用部分は0埋め)
電話番号利用者の電話番号(ハイフンなし)

▼フッター行のレイアウト

項目概要
レコード区分 値が「9」の場合はフッターレコード
データ件数データレコードの件数

■マスクツールの仕様

データ行の「会員番号」を「AAAAAAAAA」、「電話番号」を「BBBBBBBBBBB」に変換する。

また、フォルダ構成は以下の通りとする。

可変長ファイルマスクフォルダ
│ file_msk.vbs

├─00_マスク前
│ sample_data.csv

└─01_マスク後
sample_data.csv

「00_マスク前」フォルダにマスク前のファイルを格納し、「 file_msk.vbs 」を実行すると「 01_マスク後 」フォルダにマスク後のファイルを格納する。

▼フローチャート

▼プログラム仕様

#入力処理内容出力
1ファイルオブジェクトをセットする。
WScript.CreateObject(“Scripting.FileSystemObject”)
2sample_data.csv入力ファイルの設定する。
3出力ファイルを設定する。sample_data.csv
4【ループ開始 #4 – 10】
入力ファイルを最終行まで1行ずつ読み込む。
51行ずつ読み込んだ文字列を格納する。
61行ずつ読み込んだ文字列を
カンマ区切りで配列に格納する。
71要素目の値が”2″の場合
→yes(真)であれば#8へ移動
→no(偽)であれば#10へ移動
8会員番号をマスクする。
9電話番号をマスクする。
10出力ファイルへ文字列を出力する。
(カンマ区切り)
【ループ終了】
sample_data.csv
11入力ファイルを閉じる。
12出力ファイルを閉じる。
13ファイルオブジェクトを閉じる。

▼定数一覧

定数名(論理)
マスク用会員番号AAAAAAAAA
マスク用電話番号BBBBBBBBBBB

▼サンプルコード

' 定数
const MskUserNo = "AAAAAAAAA"		' 会員番号をAにマスクする定数
const MskTelNo = "BBBBBBBBBBB"		' 電話番号をBにマスクする定数

' 変数
Dim fso				'ファイルオブジェクトを格納する変数
Dim input_file		' 読み込むファイルを格納する変数
Dim output_file		' 出力ファイルを格納変数


' ファイルオブジェクトをセット
set fso = WScript.CreateObject("Scripting.FileSystemObject")

' 入出力ファイルの設定
Set input_file = fso.OpenTextFile(".¥00_マスク前¥sample_data.csv", 1, False, 0)
Set output_file = fso.OpenTextFile(".¥01_マスク後¥sample_data.csv", 2, True)

' 読み込みファイルから1行ずつ読み込み、出力ファイルに最終行まで出力する
Do Until input_file.AtEndOfStream
	Dim lineStr		' 1行ずつ読み込んだ文字列を格納する変数
	Dim tmp_array	' CSVカンマ区切りで分割した値をか格納する配列
	
	' 1行ずつ読み込んだ文字列を格納
	lineStr = input_file.ReadLine
	
	' カンマ区切りで配列に格納
	tmp_array = split(lineStr, ",")
	
	' 1桁目がデータレコード(2)であれば、マスク対象
	if tmp_array(0) = "2" then
		' 会員番号(3つ目)と電話番号(6つ目)をマスクする(配列は0始まり)
		 tmp_array(2) = MskUserNo
		 tmp_array(5) = MskTelNo
	end if
	
	' 出力ファイルへ文字列を出力する
	output_file.WriteLine join(tmp_array, ",")
Loop

MsgBox "完了"

' 入出力ファイルを閉じる
input_file.Close
output_file.Close

' ファイルオブジェクトを閉じる
set fso = nothing

▼実行結果

コメント