【VBS】改行なしのファイルに改行付与する処理

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

今回はレコード長が固定長で改行コードが一切ないファイルを、レコード長の間隔で改行コードを付与して改行コードありファイルにする方法です。


CONTENTS

1.概要
2.ファイル仕様とデータ内容
3.コード内容
4.前提と使用方法
5.おわりに



1.概要

冒頭に書いた通り、今回は改行コードが付与されていないファイルに対し改行コードを付与する処理です。

以前「固定長ファイル・可変長ファイルを区切るExcelツール」の番外においてサクラエディタの「指定桁で折り返す」設定を利用して1レコードを改行させていましたが、今回はVBScriptでファイルを読み込み、改行コードを付与する方法について記載します。



2.ファイル仕様とデータ内容

今回改行コードを付与するファイルの実例として使用するファイルの仕様について記載します。

【データ領域形式】
固定長

【改行コード】
CRLF

【文字コード】
SJIS

【区切り文字】
なし

【レコード長(1レコード当たりのバイト数)】
75

【ファイルレイアウト:銘柄基本情報ファイル】

連番項目名サイズ説明
1銘柄コードchar4銘柄コードをセット
2銘柄名char60銘柄名を全角30文字でセット
3銘柄区分char1銘柄の種類をセット
1:普通株
2:ETF
3:REIT
4:インフラファンド
4運用資産区分char2運用資産の種類をセット
00:その他(※1)
01:事業所主体型
02:住居主体型
03:商業施設主体型
04:ホテル主体型
05:物流施設主体型
07:総合型
08:複合型
09:ヘルスケア施設主体型
※1)銘柄区分=3(REIT)以外の場合に設定
5基準年月日char8データの基準年月日

今回使用するファイルは改行コード無しファイルの為、ファイルレイアウト上も改行コードの定義がない状態です。
(改行コード有りファイルでも、項目定義上には改行コードの項目を記載しない場合もあります)

なお銘柄区分、運用資産区分はコード値まで定義を一応記載していますが、今回検証用のでっちあげです。


【実データ例】

銘柄コード銘柄名銘柄区分運用資産区分基準年月日
2971エスコンジャパンリート投資法人30820220809
2972サンケイリアルエステート投資法人30120220809
2979SOSiLA物流リート投資法人30520220809
2989東海道リート投資法人30720220809
3226日本アコモデーションファンド投資法人30220220809
3234森ヒルズリート投資法人30120220809
3249産業ファンド投資法人30820220809
3269アドバンス・レジデンス投資法人30220220809
3278ケネディクス・レジデンシャル・ネクスト投資法人30720220809
3279アクティビア・プロパティーズ投資法人30720220809

これが今回実際に例として使用するファイルのデータ内容です。
データレコードの件数は10件用意しました。



3.コード内容

今回作成したスクリプトは以下の通りです。

[ NewLineAdd.vbs ]

' * -----------------------------------------------------------
' * システム名         : RfromL.com
' * プログラム名       : NewLineAdd
' * 処理名             : 改行コード付与処理
' * 処理内容           : 1データレコードに改行コードを
' *                    : 付与して複数レコードに分割
' * 作成日             : 2022.08.11
' * 作成者             : S.Takaaze
' * パラメータ         : なし
' * 備考               : 入力チェックなし
' *
' * *** 修正履歴 **********************************************
' * No.  日付        修正者              内容
' * 001  2022.08.11  S.Takaaze           新規作成
' *
' * -----------------------------------------------------------
' -------------------------------------------------------------
' 定義領域
' -------------------------------------------------------------
Dim sTmp        ' 改行コード作成用
Dim input       ' 入力ファイル用
Dim output      ' 出力ファイル用

' -------------------------------------------------------------
' 1レコード分のバイト長を定義
' -------------------------------------------------------------
RecLength = 75

' -------------------------------------------------------------
' 改行コードを作成
' -------------------------------------------------------------
' ADODB.Streamオブジェクトの生成
Set sTmp = CreateObject("ADODB.Stream")

' テキストモード
sTmp.Type = 2

' キャラセットにSJISを指定
sTmp.Charset = "shift_jis"

' Stream オブジェクトを開く
sTmp.Open

' CRLF改行コードを書き込み
sTmp.WriteText vbCrLf

' Stream オブジェクト内の現在の位置を0に設定
sTmp.Position = 0

' バイナリモードに変換
sTmp.Type = 1

' 2バイト指定して読込み ※CRLF改行コードが2バイトの為
CRLF = sTmp.Read(2)

' オブジェクトクリア
Set sTmp = Nothing

' -------------------------------------------------------------
' 入力ファイルの指定
' -------------------------------------------------------------
' ADODB.Streamオブジェクトの生成
Set input = CreateObject("ADODB.Stream")

' 1:バイナリモード を指定
input.Type = 1

' Stream オブジェクトを開く
input.Open

' ファイルを読み込む
input.LoadFromFile "01-INPUT.txt"


' -------------------------------------------------------------
' 出力ファイルの指定 (今回は新規作成する)
' -------------------------------------------------------------
' ADODB.Streamオブジェクトの生成
Set output = CreateObject("ADODB.Stream")

' 1:バイナリモード を指定
output.Type = 1

' Stream オブジェクトを開く
output.Open


' -------------------------------------------------------------
' 本体処理
' -------------------------------------------------------------
' 読込みポイントがStreamの最後に到達するまで繰り返す
Do Until input.EOS
  ' 1レコード分のバイト長を指定して読込み
  line = input.Read(RecLength)

  ' 1レコード分を出力
  output.Write line

  ' 作成した改行コード"CRLF"を出力
  output.Write CRLF
Loop


' -------------------------------------------------------------
' ファイル出力処理
' -------------------------------------------------------------
' 1:指定ファイルが無ければ新規作成
' 2:ファイルがある場合は上書き
Output.SaveToFile "02-OUTPUT.txt", 2


' -------------------------------------------------------------
' 終了処理
' -------------------------------------------------------------
' オブジェクトクリア&クローズ
input.Close
output.Close

処理を一旦停止したり、画面にメッセージを表示するような処理は無いため、実行時は出力ファイルが作成されることで、目視で処理の完了を判断します。


4.前提と使用方法

前提

はじめに使用に際しての前提です。

今回作成したスクリプトは入力ファイル名、出力ファイル名を以下の通り固定にしています。

入力ファイル名:01-INPUT.txt
出力ファイル名:02-OUTPUT.txt

実行の際は、入力ファイルを上記のファイル名にリネームして作成したVBScriptファイルと同じフォルダに配置する必要があります。

上記を踏まえて使用方法の流れを記載すると以下の通りです。

①入力ファイル「01-INPUT.txt」をVBScripファイルと同じフォルダに配置します。
②VBScriptファイル「NewLineAdd.vbs」をダブルクリックして実行します。
③同フォルダ内に出力ファイル「02-OUTPUT.txt」が作成されます。

なお、実際に使用するに際して「NewLineAdd」というフォルダを作成し、そのフォルダの中にVBScriptファイル「NewLineAdd.vbs」を配置しています。


使用方法

使用方法の流れに沿って実際に実行していきます。

①入力ファイル「01-INPUT.txt」をVBScripファイルと同じフォルダに配置します。
入力ファイル仕様に沿って用意したファイルの内容が以下の画像です。



上図のファイルをVBSclipt「NewLineAdd.vbs」が格納されたフォルダと同じフォルダに配置します。




②VBScriptファイル「NewLineAdd.vbs」をダブルクリックして実行します。

今回作成したスクリプトは処理を一旦停止したりメッセージを表示するような作りになっていないので、実行時に画面上の変化は現れません。



③同フォルダ内に出力ファイル「02-OUTPUT.txt」が作成されます。



VBScliptの処理が完了すると、同フォルダ内に出力ファイル「02-OUTPUT.txt」が作成されます。
実際に出力ファイルの内容を開くと下図のようになっています。

出力ファイルの内容をみると、固定長ファイルなので改行コードが付与されると綺麗に整列した漢字でファイルが作成されています。

基準年月日が末尾項目なので、基準年月日「20220809」の後ろに改行コード「CRLF」が付与され入力ファイルでは1レコードで表示されていたのが、10レコードで表示されていることが確認できます。



5.おわりに

今回は改行コード無しのファイルに対し、1レコード当たりのサイズを指定して改行コードを付与する処理についてでした。

実際の現場でも改行コード無しのファイルというのは、頻度としては多くはないですが、無くはないといった感じです。

経験した中だとIBMホストから連携されてきたファイルが改行コードなしだったことがあります。
(ちょっと記憶があいまいなので、ちがったかもしれませんが)

この時は以下の流れで処理を行ったと記憶しています。

①連携元「IBMホスト」から文字コード「EBCDIC」のファイルを受信
②受信したファイルの文字コードを富士通製のコード変換ソフト「MDPORT」で「EUC」に変換
③「EUC」に変換したファイルをプログラムで読み込む際に、改行コード無しのファイルとして1レコードサイズを指定して読み込む
④プログラムで出力する際に改行コード「LF」を付与

今回のVBScriptツールは上記のような対応の際「③④」のプログラムを作成してテストを実施する時、プログラムの実行結果が想定通りで無かった時にどこに問題があるか以下の切り分けを行います。

①プログラム自体に問題があったのか
②入力ファイル内のデータに問題があったのか

上記の切り分けを行う為にテスト用に作成した入力ファイルを一旦見やすい形にして、ファイル内のデータ側に問題がなかったかを確認の際に使用することができます。
用意したデータ側に問題が無ければ、プログラム側の問題になるのでプログラムの解析を行うといった対応を行うことができます。

まあ改行コード無しのファイルと出会う頻度は多くないので、このツールを使う機会はそんなになさそうですけどね。

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