【入門編】【データ整形バッチ】FSOで固定長テキストファイルを読み込みTSV形式へ変換・パースする泥臭く役立つデータ加工術 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場でバリバリと自動化ツールやバッチを作っている先輩エンジニアです。

皆さんは、レガシーな基幹システムから出力される「固定長テキストファイル」の扱いに困ったことはありませんか?
「カラムの区切り文字なんて洒落たものはない。ただ文字数が詰まっているだけだ。Excelで開こうにも、全角・半角が入り混じってズレまくる……」

そんな泥臭い現場の救世主となるのが、今回解説する VBScriptとFileSystemObject(FSO)を組み合わせたデータ整形バッチ です。

ここをクリアすれば、VBScriptのファイル操作の基本はバッチリですよ。さあ、一緒にマクロの記録の先にある「真のファイル自動処理の世界」へ踏み込みましょう!

—

なぜFSOとVBScriptなのか?

今やPythonやPowerShell全盛の時代ですが、社内のセキュリティポリシーが厳格な現場や、新たなランタイム(Pythonなど)のインストールが許されない環境では、Windows標準で動くVBScriptが最強の武器になります。

特に、ファイルを1行ずつ安全に読み込み、メモリを無駄遣いせずにストリーム処理できる `Scripting.FileSystemObject`(FSO)は、巨大な固定長ファイルを捌く上で欠かせないオブジェクトです。

固定長ファイルとは?

例えば、以下のようなデータがあるとします。社員コード、氏名、部署コードが、それぞれ決まった桁数(バイト数)でパディング(余白埋め)されている形式です。

001山田太郎 DEV1
002鈴木花子 SAL2

これを `Mid` 関数でスパッと切り出し、Excelやデータベースが大好物な TSV(タブ区切り)形式 に変換するのが今回のミッションです。

—

アーキテクチャの全体像

処理の流れは非常にシンプルかつ堅牢です。

1. FSOの生成:ファイルシステムを操作するための窓口を開きます。
2. 入出力ストリームの確立:読み込み元の固定長ファイルと、書き込み先のTSVファイルをオープンします。
3. 1行ずつのループ処理:

  • ファイルの終端(EOF)まで1行ずつ読み込む。
  • `Mid` 関数(必要に応じてバイト単位の考慮も)で指定桁数を切り出す。
  • タブ区切り(`vbTab`)で連結する。
  • 新しいファイルへ書き出す。

4. リソースの解放:オブジェクトを明示的に破棄し、メモリリークを防ぐ。

—

実践!固定長をTSVへ変換するVBScriptコード

以下のコードをメモ帳に貼り付け、拡張子を `.vbs` (例:`conv_fixed_to_tsv.vbs`)として保存してください。

‘ ==============================================================================
‘ スクリプト名: FixedToTsvConverter.vbs
‘ 概要: 固定長テキストファイルを読み込み、TSV形式へ変換して出力するバッチ
‘ 著者: チーフアーキテクト先輩
‘ ==============================================================================
Option Explicit

‘ 定数の定義
Const ForReading = 1
Const ForWriting = 2
Const TristateUseDefault = -2

Dim fso, objFileIn, objFileOut
Dim inputPath, outputPath
Dim strLine, empCode, empName, deptCode
Dim lineCount

‘ 入出力ファイルのパス設定(同じフォルダにある想定)
inputPath = “C:\Work\employee_data.txt”
outputPath = “C:\Work\employee_output.tsv”

‘ 1. FSOのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ エラーハンドリングの基本:入力ファイルの存在チェック
If Not fso.FileExists(inputPath) Then
MsgBox “エラー: 入力ファイルが見つかりません。” & vbCrLf & inputPath, vbCritical, “ファイルエラー”
WScript.Quit
End If

‘ 2. ファイルのオープン(入力:読み込み専用 / 出力:新規作成・上書き)
Set objFileIn = fso.OpenTextFile(inputPath, ForReading, False, TristateUseDefault)
Set objFileOut = fso.OpenTextFile(outputPath, ForWriting, True, TristateUseDefault)

‘ ヘッダー行をTSVに出力する場合
objFileOut.WriteLine “社員コード” & vbTab & “氏名” & vbTab & “部署コード”

lineCount = 0

‘ 3. ファイルの終端までループ
Do Until objFileIn.AtEndOfStream
strLine = objFileIn.ReadLine
lineCount = lineCount + 1

‘ 空行スキップの安全策
If Trim(strLine) <> “” Then
‘ 【ここがキモ!】固定長の切り出し (Mid関数: 1文字目から、文字数を指定)
‘ 例: 社員コード 3桁 (1〜3文字目)
empCode = Trim(Mid(strLine, 1, 3))

‘ 例: 氏名 10文字 (4〜13文字目)
empName = Trim(Mid(strLine, 4, 10))

‘ 例: 部署コード 4文字 (14〜17文字目)
deptCode = Trim(Mid(strLine, 14, 4))

‘ TSV形式(タブ区切り)に結合して書き出し
objFileOut.WriteLine empCode & vbTab & empName & vbTab & deptCode
End If
Loop

‘ 4. クローズとオブジェクトの解放(メモリ管理の作法)
objFileIn.Close
objFileOut.Close

Set objFileIn = Nothing
Set objFileOut = Nothing
Set fso = Nothing

‘ 完了メッセージ
MsgBox “変換が完了しました!” & vbCrLf & “処理行数: ” & lineCount & “行”, vbInformation, “処理成功”

—

コードの深掘り解説と「現場の罠」

プログラミング初学者がここでハマりがちなポイント、そしてプロフェッショナルなら知っておくべき「作法」をいくつか解説します。

1. `Option Explicit` はエンジニアの良心

コードの最上部に書いた `Option Explicit`。これ、何のためにあるか知っていますか?
これを宣言すると、変数の宣言忘れ(スペルミスなど)を強制的にエラーにしてくれます。 これがないと、`empCod` のように打ち間違えた時に「勝手に空の変数が作られてデータが消える」という悪夢のようなバグを生むため、VBScriptを書くときは必ず最初につけましょう。

2. `Mid` 関数の挙動と「文字数」の罠

VBScriptの `Mid(string, start, [length])` 関数は非常に優秀ですが、基幹システムの固定長データは「バイト数」で設計されていることが多いです。

  • 半角英数字:1文字 = 1バイト
  • 全角文字(漢字・ひらがななど):1文字 = 2バイト(環境によるがShift_JISベースのレガシー環境では顕著)

もしデータに全角が混ざる場合、単純な `Mid`(文字数指定)だと文字化けやズレが起きます。その場合は、一度Shift_JISのバイナリとして安全に処理するか、ADO.Streamなどを使ったマルチバイト対応を検討する必要がありますが、まずはこの基本の `Mid` をマスターすることが第一歩です。

3. オブジェクトの明示的な解放 (`Set … = Nothing`)

VBScriptはガベージコレクションがイマイチ賢くありません。スクリプトが終了すればメモリは解放されますが、巨大なファイルを扱うバッチや、ループ内でオブジェクトを生成・破棄するようなコードでは、使い終わったら `Set obj = Nothing` を明示的に呼ぶのが、メモリリークを防ぐシニアの知恵です。

—

まとめ:VBScriptの基本はバッチリ!

お疲れ様でした!ここまで理解できれば、以下のスキルが身についたことになります。

  • `FileSystemObject` を使った安全なテキストファイルの入出力
  • `Do Until AtEndOfStream` による堅牢なループ処理
  • `Mid` と `Trim` を組み合わせた固定長データのパディング剥がしと切り出し
  • `vbTab` を使ったTSV形式へのデータ整形

手作業でコピペしてExcelで整形していたような面倒な定型業務も、このVBScriptをタスクスケジューラに登録しておけば、完全自動化の不夜城バッチに生まれ変わります。

「ここをクリアすれば、VBScriptの基本はバッチリですよ!」
ぜひ、あなたの現場の自動化にもこの知見を役立ててくださいね。それでは、次の現場でお会いしましょう!

タイトルとURLをコピーしました