【VBS】大量のレコード数があるファイルを分割する処理

いつもお世話になっております。
RfromL.comです。

今回は大量のレコード数があるファイルを分割する処理についてです。


1.はじめに

本番稼働時の処理結果検証、プログラムのテスト時の検証など、処理の結果で出力されるファイルについて内容を確認することがあります。

ファイルのレコード数が少なければ、そのままテキストエディタで開いて内容を確認すれば良いですが1ファイルに何万ものレコード数が出力される処理という場合、ファイルを開くだけで時間がかかったりします。

また、検証結果としてExcelシートにデータを貼り付けることもありますが、Excelシートにも最大行数が存在していてあまりにもレコード数が多いと1シートに貼り付けられないこともあります。

そんな時に、ファイルを一定のレコード数で分割して、検証を行いやすくする処理をVBScriptで作成してみました。

なお、今回のフォルダ構成は以下となっています。

フォルダ構成

2.作成スクリプト

2-1.コード内容

用意するスクリプトファイルのコード内容は以下の通りです。

[ FileSplit.vbs ]

' FileSplit.vbs
' * -----------------------------------------------------------
' * 処理名             : ファイル分割処理
' * 処理内容           : CSVファイルをエクセルで表示させるには
' *                      行数が限られています。
' *                      このスクリプトを使用してエクセルの
' *                      表示限界(64388)行毎にファイルを
' *                      分割します。
' * 作成日             : 2025.03.14
' * 作成者             : RfromL.com
' * パラメータ         : 0:InFile  (入力ファイルフルパス)
' *                      
' * 備考               : 下記ソースを「FileSplit.vbs」で保存
' *                      して、分割したいファイルをこの
' *                      スクリプトアイコンに
' *                      ドラッグ&ドロップします。
' * *** 修正履歴 **********************************************
' * No.  日付        Author              Description
' * 
' * -----------------------------------------------------------
' -------------------------------------------------------------
' 変数の宣言&情報の取得
' -------------------------------------------------------------
' 変数定義
Dim rFS, rTemp, rWshShell              '読込用
Dim wFS, wTemp, wWshShell              '出力用

' 定数定義
Const ForReading = 1                   '読取り専用でOPEN
Const ForWriting = 2                   '書き込み専用でOPEN
Const strFine = "分割が完了しました。" 'メッセージ
Const MaxLine = 64388                  '最大分割行

' -------------------------------------------------------------
' 引数取得
' -------------------------------------------------------------
Set objArgs = WScript.Arguments

' -------------------------------------------------------------
' メイン処理
' -------------------------------------------------------------
' ドラッグドロップファイル名ループ(複数ファイルに対応)
For I = 0 to objArgs.Count - 1

  ' 読み込みオブジェクト作成
  Set rWshShell = WScript.CreateObject("WScript.Shell")
  Set rFS = WScript.CreateObject("Scripting.FileSystemObject")

  rTemp = objArgs(I)

  ' ファイル取得
  Set rFile = rFS.GetFile(rTemp)

  ' 入力ファイルオープン
  Set rbjScriptFile = rFS.OpenTextFile(rTemp, ForReading, True)

  ' 入力ファイルの親フォルダのパスを取得
  strMakeName = rFile.ParentFolder

  ' 書き込みオブジェクト作成
  Set wWshShell = WScript.CreateObject("WScript.Shell")

  Set wFS = WScript.CreateObject("Scripting.FileSystemObject")

  DataLine = 1  '出力レコード件数
  FileCount = 1 '出力ファイル件数

  ' レコード読込+出力ループ
  Do While rbjScriptFile.AtEndOfStream <> TRUE

    ' レコード出力件数が最大分割行数以上の場合
    ' または、出力ファイル件数が1、且つ出力レコード件数が1の場合
    If (DataLine >= MaxLine) Or (FileCount = 1 And DataLine = 1) Then
      ' 出力ファイル件数が1を超える場合
      If FileCount > 1 Then
        ' ファイル出力オブジェクトクローズ
        wbjScriptFile.Close

      End If

      ' 出力ファイル名(フルパス)設定
      wTemp = strMakeName & "\" & wFS.GetBaseName(rFile.Name) & "_" &FileCount & "." & wFS.GetExtensionName(rFile.Name)

      Set wbjScriptFile = wFS.OpenTextFile(wTemp, ForWriting, True)

      ' 出力ファイル数をカウントアップ
      FileCount = FileCount + 1
      DataLine = 0

    End If


    ' レコード読込
    strCurrentLine = rbjScriptFile.ReadLine

    ' レコード出力
    wbjScriptFile.WriteLine strCurrentLine

    ' 読込レコード数カウントアップ
    DataLine = DataLine + 1

  Loop

  rbjScriptFile.Close

Next

' -------------------------------------------------------------
' 終了処理
' -------------------------------------------------------------
' メッセージ出力
WScript.Echo strFine

補足
コメント部分(「’」で始まる行)は不要であれば削除してください。

2-2.コード・機能解説

CSVファイルをExcelで表示させるには行数が限られていますので、このスクリプトではExcelの表示限界(64388)行毎にファイルを分割します。
なお、Office2003までの形式「.xls」ファイルでの表示限界、64388行を最大としていますが現行のOffice形式「.xlsx」ファイルでの表示限界行数は、1048576行です。

分割後の1ファイルあたりの行数を変更したい場合は、ソースコード内の定数定義部分にて「Const MaxLine」の値を分割したい行数に修正してください。

[対象のコード]

' 定数定義
Const ForReading = 1                   '読取り専用でOPEN
Const ForWriting = 2                   '書き込み専用でOPEN
Const strFine = "分割が完了しました。" 'メッセージ
Const MaxLine = 64388                  '最大分割行

3.使用方法と実行結果

3-1.使用方法

使用方法の流れは以下の通りです。

①「FileSplit」フォルダを配下のVBSプログラムごと好きな場所に配置します。
②入力ファイルを任意の場所に配置します。
③分割したいファイルを「FileSplit\pgm」配下にある「FileSplit.vbs」にドラッグ&ドロップします。
④ファイル分割が完了すると「分割が完了しました。」のメッセージがダイアログ表示されます。
⑤ダイアログの「OK」ボタンをクリックして処理を終了させます。



3-2.実行結果

使用方法にしたがって実際に実行して結果を確認します。

①「FileSplit」フォルダを配下のVBSプログラムごと好きな場所に配置します。
適当なフォルダの配下にプログラムフォルダごと配置しました。




②入力ファイルを任意の場所に配置します。
分割したいファイルの置き場所はどこでもいいので、今回は「FileSplit.vbs」と同フォルダ「..\FileSplit\pgm\」配下に配置しました。

用意した入力ファイルの内容は以下のようになっています。
レコード数「1048580」行、文字コード「SJIS」、改行コード「CRLF」、区切り文字「,」(カンマ)、レコード長「20」

[ TEST-FILE.txt ]



③分割したいファイルを「FileSplit\pgm」配下にある「FileSplit.vbs」にドラッグ&ドロップします。

処理が実行されファイルが分割されていきます。




④ファイル分割が完了すると「分割が完了しました。」のメッセージがダイアログ表示されます。




⑤ダイアログの「OK」ボタンをクリックして処理を終了させます。




レコード数「1048580」の入力ファイルを「64388」レコード毎に分割したので16ファイルと端数1ファイルで計17ファイル出力されました。



分割処理後の出力ファイルを開いて内容を確認してみます。
1ファイル目「TEST-FILE_1.txt」を見てみると指定した分割数「64388」で出力されていることが確認できます。




最終分割ファイル「TEST-FILE_17.txt」を見てみると分割後の端数分レコードが出力されていることがわかります。


4.おわりに

実行結果確認に用意したテストファイルは、レコード数は多いもののレコード長があまり長くなくファイルサイズがそこまで大きくないので、普通にテキストファイルで開けましたが、実際にはレコード数が多くレコード長も超大なファイルを使っていることもあります。
そういったファイルは開くだけで時間もかかるし、検証の為に編集するのも余計な時間がかかったりします。

現場によっては分割できるソフトウェアがあったりしますが、ない事も多いのでファイル分割スクリプトを用意してあると役に立ったりすることもあります。

今回のPGですとドラッグ&ドロップでファイルを入力するスクリプトでしたが、他のバッチスクリプトツールで引数指定で組み込んだり、その際はメッセージダイアログの表示は不要にしたり用途に応じてカスタマイズしてみてください。

以上です。
宜しくお願い致します。



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