【入門編】【制御文字クリーニング】Chr / Asc 関数を用いた不可視の制御コードや外字の検出・一括除去ロジック – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは! VBScriptの世界へようこそ。
業務の自動化を進めていると、外部システムからCSVやテキストファイルを取り込む機会が頻繁に出てきますよね。

「よし、これで処理できる!」と思ったら、なぜか正体の分からないエラーが出たり、Excelのセルに変な空白や文字化けが混入したり……。そんな経験はありませんか?

その原因、実は「目に見えない制御文字や不要なコード」がテキストにこっそり潜んでいるからなんです。

今回は、VBScriptの基本である `Chr` 関数と `Asc` 関数を武器にして、こうした厄介な不可視文字を検出し、一網打尽にするクレンジングロジックを一緒にマスターしていきましょう。ここをクリアすれば、データ処理のトラブルシューティング能力がグッと跳ね上がりますよ。それでは、さっそく本題に入りましょう!

1. なぜ「見えない文字」がシステムを狂わせるのか?

私たちが普段何気なく見ているテキストデータは、文字だけでなく「改行」や「タブ」、そしてプログラムの暴走を誘発する「ヌル文字(`Chr(0)`)」などが複雑に絡み合ってできています。

特に外部のレガシーシステムや、Web APIから出力された生データには、人間には認識できないコードが混入しがちです。

  • ヌル文字 (`Chr(0)`): 文字列の終端と誤認され、データが途中で途切れる原因に。
  • 制御文字 (`Chr(1)` 〜 `Chr(31)`): データベースのインポートエラーや、Excelマクロの予期せぬ停止を引き起こす。
  • 外字や特殊記号: 環境依存文字として化けやすい。

これらを人力で目視確認するのは不可能です。だからこそ、VBScriptで「数値(文字コード)」に変換して機械的に検出し、スパッと切り捨てるアプローチが必要になります。

2. 基礎知識:Asc 関数と Chr 関数の仕組み

VBScriptで文字をコード(数値)に変換するのが `Asc` 関数、逆にコードから文字を生成するのが `Chr` 関数です。

  • `Asc(“A”)` = `65` (アルファベットのAは文字コード65)
  • `Chr(65)` = `”A”` (65という数字を文字に戻すとA)

この「文字と数字のキャッチボール」ができるようになると、テキストデータの外科手術ができるようになります。例えば、「文字コードが特定の範囲外のものはすべて消す」というフィルター処理が作れるわけですね。

3. 実践!制御文字クリーニング・一網打尽ロジック

それでは、開発現場でそのままコピペして使える実践的なVBScriptのコードをご紹介します。このスクリプトは、テキストに含まれる「制御文字(改行・タブ以外の有害なコード)」を検出し、きれいな文字列に浄化するものです。

メモ帳などに貼り付けて `cleaner.vbs` という名前で保存し、ダブルクリックして動作を確認してみてください。

Option Explicit

‘ =================================================================0
‘ 制御文字クレンジング・サンプルスクリプト
‘ =================================================================跳
Dim rawData, cleanedData
rawData = “受発注データ” & vbCrLf & “A001” & Chr(0) & “商品A” & Chr(7) & vbTab & “100”

WScript.Echo “【処理前のデータ(生データ)】” & vbCrLf & rawData & vbCrLf & “———————————-”

‘ クレンジング実行
cleanedData = RemoveControlCharacters(rawData)

WScript.Echo “【処理後のデータ(クレンジング済み)】” & vbCrLf & cleanedData

‘ =================================================================0
‘ 関数名: RemoveControlCharacters
‘ 概要: 文字列から不要な制御文字(ヌル文字やビープ音など)を除去する
‘ =================================================================0
Function RemoveControlCharacters(targetStr)
Dim i, c, code, result
result = “”

‘ 文字列を1文字ずつスキャンする
For i = 1 To Len(targetStr)
c = Mid(targetStr, i, 1)
code = Asc(c)

‘ 【判定ロジック】
‘ 制御文字(ASCIIコード 0〜31)のうち、
‘ タブ(9)、改行(10)、復帰(13) はデータ構造上必要なため残し、他は削除する
If (code >= 32) Or (code = 9) Or (code = 10) Or (code = 13) Then
result = result & c
Else
‘ デバッグ用:どんな制御文字が除去されたかをコンソールに出力
‘ WScript.Echo “除去された制御文字コード: ” & code
End If
Next

RemoveControlCharacters = result
End Function

コードのポイント解説

1. `Len` と `Mid` の組み合わせ: VBScriptの基本中の基本。文字列を1文字ずつ分解してループ処理します。
2. ホワイトリスト方式の条件分岐: 「残していいもの(タブ、改行、通常の文字)」以外は容赦なく排除する(結果に追加しない)という安全な設計にしています。

4. 現場で陥りやすい罠と注意点

初心者のエンジニアがこの領域でハマりがちなポイントを先回りして解説しておきますね。

① マルチバイト文字(日本語)との相性

`Asc` 関数は、実は古いANSI規格をベースにしているため、日本語の全角文字を扱うと予期せぬマイナス値やエラーを返すことがあります。
完全な全角・半角のバイナリレベルの制御を行いたい場合は、より高度な正規表現オブジェクト(`VBScript.RegExp`)を組み合わせるのがプロの技です。

例えば、制御文字を正規表現で一発で消し去るなら、以下のように書くこともできます。

Function RemoveControlCharsRegEx(targetStr)
Dim regEx
Set regEx = New RegExp

‘ タブと改行以外の制御文字(\x00-\x1F)をマッチさせる
regEx.Pattern = “[\x00-\x08\x0B\x0C\x0E-\x1F]”
regEx.Global = True

RemoveControlCharsRegEx = regEx.Replace(targetStr, “”)
End Function

ループを回すよりも圧倒的に高速で、巨大なテキストファイルでも瞬時に処理が終わります。オブジェクトのライフサイクル(`Set` と解放)を意識するVBScriptならではのスマートな書き方ですね。

まとめ

今回は、`Chr` / `Asc` 関数を用いた制御文字の検出と、データクレンジングの極意について解説しました。

  • 見えないエラーの原因は `Chr(0)` などの制御文字にある。
  • `Asc` 関数で数値化して、必要な文字だけを残す(または正規表現で一括置換する)。
  • 基礎的なループ処理から、高速な正規表現オブジェクトへのステップアップが自動化エンジニアへの近道。

ここをクリアできれば、どんなに汚い外部データが回ってきても恐れるものはありません。あなたのVBScriptスキルは、確実に実務レベルの一流へと近づいています。

日々の自動化ライフを、もっとエレガントに、もっと強靭にしていきましょう。それではまた!

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