[vbs] 複数テキストファイルをD&Dして中の文字列を一括置換するやつ


- 複数のテキストファイルを下記のvbsファイルにD&Dするとファイル内の文字列が置換されるvbs

- 以下例としてExcelからそのまま貼り付けた状態のテキストファイルを
ダブルクオート括りのカンマ区切り形式にするやつ
\t　　⇒　","
\r\n　⇒　""\r\n""
※読み込むファイルはSJISで、最後がcrlfで終わっていないものとしている

```vb:ReplaceText.vbs
Option Explicit        

' -------------------------
' 置換用オブジェクトの定義01（tab）
' -------------------------
Dim objRepTab
Set objRepTab = New RegExp
objRepTab.Pattern = vbTab  '置換前の文字（正規表現OK）
objRepTab.Global = True 
Dim strRepTab
strRepTab = ""","""  '置換後の文字列

' -------------------------
' 置換用オブジェクトの定義02（改行）
' -------------------------
Dim objRepCrLf
Set objRepCrLf = New RegExp
objRepCrLf.Pattern = vbCrLf  '置換前の文字（正規表現OK）
objRepCrLf.Global = True 
Dim strRepCrLf
strRepCrLf = """" & vbCrLf & """"  '置換後の文字列

' -------------------------
' D&Dでファイルパスを取得
' -------------------------
Dim GetPathArray
Set GetPathArray = WScript.Arguments 

' -------------------------
' ファイルシステムオブジェクト
' -------------------------
Dim objFSO      
Set objFSO = CreateObject("Scripting.FileSystemObject") 
  
' -------------------------
' ファイルの数だけループする
' -------------------------
Dim pt         ' イテレータ
Dim objFile    ' ファイル用オブジェクト
Dim strTmp     ' 置換用文字列

For Each pt in GetPathArray      

    ' -------------------------
    ' ファイル内文字列の読み取り
    ' -------------------------
    Set objFile = objFSO.OpenTextFile(pt)
    strTmp = objFile.ReadAll
    
    ' -------------------------
    ' ファイル内文字列の置換 
    ' -------------------------
    strTmp = objRepTab.Replace(strTmp,strRepTab)
    strTmp = objRepCrLf.Replace(strTmp,strRepCrLf)
    strTmp = """" & strTmp & """"

    ' -------------------------
    ' 置換後文字列の書き込み
    ' -------------------------
    Set objFile = objFSO.CreateTextFile(pt)
    objFile.Write(strTmp)
    objFile.Close

Next

'オブジェクト変数をクリア
Set objFSO = Nothing

```


- 「置換用オブジェクトの定義」と「ファイル内文字列の置換」のコメントがある部分を
適宜カスタマイズして使う。

- 置換前の文字列の指定には正規表現が使用可能
※vbsの正規表現で^と$を使うと行頭/行末ではなく、文字列の頭/文字列の末になることに注意
　⇒ReadAllではなくReadLineで繰り返させるにすることでもうちょい綺麗にできそう

----
【追記】
読み込ませるファイルの文字コードがSJISなら↑で問題ないけどUTF-8だと文字化けすることに気づいたので、
UTF-8対応バージョンを作成、以下にサンプルコード記載

```vb:ReplaceText_utf8.vbs
Option Explicit        

' -------------------------
' 置換用オブジェクトの定義01（tab）
' -------------------------
Dim objRepTab
Set objRepTab = New RegExp
objRepTab.Pattern = vbTab
objRepTab.Global = True 
Dim strRepTab
strRepTab = ""","""

' -------------------------
' 置換用オブジェクトの定義02（改行）
' -------------------------
Dim objRepCrLf
Set objRepCrLf = New RegExp
objRepCrLf.Pattern = vbCrLf
objRepCrLf.Global = True 
Dim strRepCrLf
strRepCrLf = """" & vbCrLf & """"

' -------------------------
' D&Dでファイルパスを取得
' -------------------------
Dim GetPathArray
Set GetPathArray = WScript.Arguments 

' -------------------------
' ファイルシステムオブジェクト
' -------------------------
Dim objFSO      
Set objFSO = CreateObject("Scripting.FileSystemObject") 

' -------------------------
' 読み取り用オブジェクトの設定
' -------------------------
Dim objAdstR   ' 読み取り用ADODB.streamオブジェクト
Set objAdstR = CreateObject("ADODB.Stream")   
objAdstR.Mode = 3  ' 3:adModeReadWrite
objAdstR.Type = 2  ' 2:adTypeText
objAdstR.Charset = "UTF-8"

' -------------------------
'　書き込み用オブジェクトの設定
' -------------------------
Dim objAdstW   ' 書き込み用ADODB.streamオブジェクト
Set objAdstW = CreateObject("ADODB.Stream")   
objAdstW.Mode = 3  ' 3:adModeReadWrite
objAdstW.Type = 2  ' 2:adTypeText
objAdstW.Charset = "UTF-8"

' -------------------------
' ファイルの数だけループする
' -------------------------
Dim pt         ' イテレータ
Dim strTmp     ' 置換用文字列

For Each pt in GetPathArray      

   ' ------------------------
   ' オブジェクトのOpen
   ' -------------------------
   objAdstR.Open
   objAdstW.Open

   ' ------------------------
   ' ファイル内文字列の読み取り
   ' -------------------------
   objAdstR.LoadFromFile(pt)
   strTmp = objAdstR.ReadText(-1)
   
   ' -------------------------
   ' ファイル内文字列の置換 
   ' -------------------------
   strTmp = objRepTab.Replace(strTmp,strRepTab)
   strTmp = objRepCrLf.Replace(strTmp,strRepCrLf) 
   strTmp = """" & strTmp & """" 

   ' -------------------------
   ' 置換後文字列の書き込み
   ' -------------------------
   objAdstW.WriteText strTmp, 0 
   objAdstW.SaveToFile(pt&"_rep")
   
   ' ------------------------
   ' オブジェクトのClose
   ' -------------------------
   objAdstW.Close
   objAdstR.Close

Next

'オブジェクト変数をクリア
Set objAdstW = Nothing
Set objAdstR = Nothing
```

- 適当なオブジェクト（objFile）で適当に読み書きさせていたところを、ADODB.streamで行うようにした

- 読み／書きのCharsetをSJIS/UTF-8にすることで、
例えばSJISで読み込んでUTF-8で書き込むとか、その逆も可能

- ADODB.streamで読み込んだファイルに書き込もうとするとうまくいかなかったので、
末尾に適当な文字列を付与した別ファイルとして保存することにした