■可変長ファイル
可変長ファイルとは、固定長ファイルとは異なり、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”) | ー |
2 | sample_data.csv | 入力ファイルの設定する。 | |
3 | ー | 出力ファイルを設定する。 | sample_data.csv |
4 | ー | 【ループ開始 #4 – 10】 入力ファイルを最終行まで1行ずつ読み込む。 | ー |
5 | ー | 1行ずつ読み込んだ文字列を格納する。 | ー |
6 | ー | 1行ずつ読み込んだ文字列を カンマ区切りで配列に格納する。 | ー |
7 | ー | 1要素目の値が”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
コメント