【入門編】【改行コード一括クリーンアップ】ADODB.Stream と Split を用いた CRLF / LF / CR 混在テキストの高速標準化 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは!現場のトラブルシューティングでVBScriptをいじることが多く、「なんでこのテキストファイル、改行がバラバラなんだよ……!」と頭を抱えた経験はありませんか?

Windows標準の `CRLF`、LinuxやUnix由来の `LF`、さらには昔のMacの残骸である `CR` がごちゃ混ぜになったテキストデータ。これをそのままVBScriptで読み込もうとすると、処理がバグったり、想定外の行数になってしまったりします。

今回は、メモリー効率を極限まで高めつつ、どんな改行コードが混ざっていようとも一発でWindows標準の `CRLF` に綺麗に統一する「改行コード一括クリーンアップ・モジュール」を一緒に作っていきましょう。

ここをクリアすれば、VBScriptにおけるI/Oと文字列操作の本質はバッチリ見えてきますよ。温かく導きますので、肩の力を抜いてついてきてくださいね。

なぜ改行コードの混在は厄介なのか?

文字コードや改行コードの世界には、歴史的な背景があります。

  • CRLF (`\r\n` / 0x0D 0x0A): Windowsの標準
  • LF (`\n` / 0x0A): Linux, macOS (現代)の標準
  • CR (`\r` / 0x0D): Mac OS 9以前のレガシー

VBScript標準の `Line Input` や `InStr` は、Windowsの `CRLF` を前提としていることが多く、純粋な `LF` だけのファイルを読み込むと、ファイル全体を「1行」と誤認してしまいます。

これを力技で `Replace` 関数を使って置き換えようとすると、メモリ上で何度も巨大な文字列の複製が作られ、パフォーマンスが劇的に低下(あるいはメモリ不足エラー)を引き起こします。

そこで登場するのが、`ADODB.Stream` オブジェクト`Split` 関数のコンビネーションです。

アーキテクチャの全体像:ADODB.Stream × Split

今回構築するモジュールの肝は以下の2点です。

1. `ADODB.Stream` で文字コードを安全にロードする
ファイルIOの標準である `FileSystemObject (FSO)` は、実は改行コードの変換において融通が利きません。一方、データベース操作でおなじみの `ADODB.Stream` を使うと、文字コード(UTF-8やShift-JISなど)を完全に指定して安全にテキストをメモリ上に展開できます。
2. `Split` 関数で「生きた改行」を一度すべて分解・再結合する
CRLF、LF、CRのそれぞれを、一度VBScriptが最も扱いやすい単一の改行(あるいは一時的なセパレータ)に均し、`Split` で配列にバラして、`Join` で一気に `CRLF` で繋ぎ直します。

実装コード:改行クリーンアップ・モジュール

以下のコードをメモ帳などに貼り付け、拡張子を `.vbs` (例: `clean_text.vbs`)で保存してください。実務でそのまま使える堅牢な設計にしています。

Option Explicit

‘ ==============================================================================
‘ スクリプト名: CleanLineBreaks.vbs
‘ 概要: 異なる改行コード(CRLF, LF, CR)が混在するファイルを読み込み、
‘ メモリー効率良く Windows標準の CRLF に一括変換して保存する
‘ ==============================================================================

Dim targetFilePath, outputFilePath
targetFilePath = “C:\Work\mixed_data.txt” ‘ 処理対象のファイルパス
outputFilePath = “C:\Work\cleaned_data.txt” ‘ 出力先ファイルパス

‘ 実行
Call CleanLineBreaks(targetFilePath, outputFilePath)

WScript.Echo “すべての改行コードのクリーンアップが完了しました!”

‘ ——————————————————————————
‘ 関数名: CleanLineBreaks
‘ 引数:
‘ strInPath – 読み込み元ファイルパス
‘ strOutPath – 書き出し先ファイルパス
‘ ——————————————————————————
Sub CleanLineBreaks(strInPath, strOutPath)
Dim objStream
Dim fileContent
Dim cleanedContent

‘ 1. ADODB.Streamオブジェクトの生成
‘ (※VBScriptでバイナリや大容量テキストを扱う際の最強の武器です)
Set objStream = CreateObject(“ADODB.Stream”)

With objStream
.Type = 2 ‘ 2 = adTypeText (テキストデータとして扱う)
.Charset = “utf-8” ‘ 必要に応じて “shift_jis” などに変更してください
.Open

‘ ファイルからストリームへデータをロード
.LoadFromFile strInPath
fileContent = .ReadText(-1) ‘ -1 = adReadAll (全テキストを読み込む)
.Close
End With

‘ 2. 混在する改行コードの正規化ロジック
‘ ステップA: 最初に混在している可能性のある “CRLF” を単一の “LF” に一旦置換する
cleanedContent = Replace(fileContent, vbCrLf, vbLf)

‘ ステップB: 単独の “CR” も “LF” に置換する (これで全ての改行が LF に統一される)
cleanedContent = Replace(cleanedContent, vbCr, vbLf)

‘ ステップC: 統一された “LF” を、Windows標準の “CRLF” に一気に置換する
‘ ※ Split と Join を使っても良いですが、一括置換の方がパフォーマンス面で圧倒的に有利です
cleanedContent = Replace(cleanedContent, vbLf, vbCrLf)

‘ 3. クリーンアップ済みのデータを別ファイルに出力する
With objStream
.Open
.Charset = “utf-8”
‘ 書き込み時の文字コードと改行を制御
.WriteText cleanedContent
.SaveToFile strOutPath, 2 ‘ 2 = adSaveCreateOverWrite (上書き保存)
.Close
End With

‘ オブジェクトの解放(メモリリークを防ぐVBScriptの作法です)
Set objStream = Nothing
End Sub

コードの深掘り解説:ここがプロの技

初心者のうちは、「動けばいいや」と書きがちですが、チーフアーキテクトとしていくつか重要なポイントを解説しておきます。

1. なぜ `Replace` の3段階コンボなのか?

コードの中盤で、以下の処理を行っています。

cleanedContent = Replace(fileContent, vbCrLf, vbLf)
cleanedContent = Replace(cleanedContent, vbCr, vbLf)
cleanedContent = Replace(cleanedContent, vbLf, vbCrLf)

もし最初に `vbCr` を `vbCrLf` に変えてしまうと、すでにWindowsの正しい改行である `vbCrLf` の中の `vbCr` まで反応してしまい、`vbCrCrLf` という壊れた改行が生まれてしまいます。
「一度すべての改行をニュートラルな `LF` に沈めてから、一斉に目的の `CRLF` に引き上げる」 というこのアプローチは、テキスト処理における定石中の定石です。覚えておいて損はありません。

2. メモリとオブジェクトのライフサイクル管理

VBScriptはガベージコレクションの挙動がややルーズです。特に `ADODB.Stream` のようなCOMコンポーネントは、処理が終わったら必ず明示的に `.Close` を呼び出し、最後に `Set objStream = Nothing` でメモリからキレイに消し去るのがプロの作法です。これを怠ると、大量のファイルをループ処理する際にメモリリークを起こしてスクリプトが突然死します。

陥りやすいエラーと対策

1. 「ファイルが見つからない(エラー 0x800A0bcc など)」

  • 原因: `LoadFromFile` で指定したパスが存在しない、または他のアプリケーション(Excelやメモ帳)でファイルがロックされています。
  • 対策: パスの記述ミスを確認し、対象ファイルが閉じられている状態で実行してください。

2. 「文字化けが発生する」

  • 原因: 読み込むファイルの文字コードと、`objStream.Charset` の設定が一致していません。
  • 対策: 日本の古いCSVやShift-JISのテキストであれば `”shift_jis”` に、モダンな環境やUTF-8(BOM付き/なし)であれば `”utf-8″` に適切に切り替えてください。

おわりに

いかがでしょうか?
今回は `ADODB.Stream` と文字列置換のアルゴリズムを組み合わせることで、どんなに荒れた改行コードのテキストであっても美しく一発で標準化できるモジュールを作成しました。

マクロの記録やその場しのぎのコードから一歩抜け出して、こうした「背後にあるオブジェクトの挙動」や「メモリ効率」を意識できるようになると、VBScriptを書くのがぐっと楽しく、そして頼もしいものになりますよ。

現場の自動化タスクでぜひ役立ててくださいね。それでは、次のスマートな自動化の世界でお会いしましょう!

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