忍者ブログ

テキストファイルの文字列を置換して上書きするVBScript

2021年05月21日
2022/7/7追記
より汎用性の高いソースができたので、ご紹介。
指定したテキストファイルの文字列を置換して、別名保存(上書き)するVBScript


SQLを操作できるフリーソフト「CSE」を使ってSELECT結果をCSV出力すると、
ダブルコーテーション「"」が付いてしまう。

ダブルコーテーションが付いていると既存のツールが動作しないので、
テキストファイルのダブルコーテーションを削除するVBScriptを作ってみた。

また、SELECT結果をエクセルに張り付けるため、
カンマをTABに置換するVBScriptも作った。

ソースは同じで置換する文字が違うだけなので、片方のみソースを掲載。


さんざん使いまわしているファイルをドラッグドロップで動く処理が長いが、
実際の処理はあんまり長くない。

ファイルを編集して上書き保存のやり方がわからず、
テキスト出力して名前を付けて保存の処理にした。

以下、ソース。




Option Explicit
'ファイルの文字コードを指定
'const strCode = "UTF-8" ' 文字コード指定 "Shift-Jis" "UTF-8"
const strCode = "Shift-Jis" ' 文字コード指定 "Shift-Jis" "UTF-8"


call main

sub main
'テキストファイルのカンマをTabに置換するVBScript

'ドラッグドロップでファイルを印刷するスクリプト
'http://chuckischarles.hatenablog.com/entry/2018/10/29/002921
'ファイル名の末尾に更新日時を付与するVBScript
'http://gren-dken.hatenablog.com/entry/2013/08/22/000119
'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
If WScript.Arguments.count = 0 then
WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
"ファイルをドロップしてください。"
WScript.Quit
End If

dim targetPath,changePath
dim FSO
'----------------------------------------------------------------------------------------------------
' ファイルシステムオブジェクト作成
Set FSO = CreateObject("Scripting.FileSystemObject")
'-------------------------------------------------------------------------------------------------------
' フォルダ内ファイルリスト出力
for each targetPath In WScript.Arguments
'----------------------------------------------------------------------------------------------------
' ドロップされた引数がフォルダかファイルかを判定する
If FSO.FolderExists(targetPath) then
' is folder.
WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
ElseIf FSO.FileExists(targetPath) then
' is file.
else
' is unknown.
WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
"処理を終了します。"
WScript.Quit
End If
' メインモジュール呼び出し
Call ReplaceCtoTab(targetPath)
Next
set FSO = nothing

WScript.Quit 'メイン処理終了

end sub
'-----------------------------------------------------------実質ここから

Sub ReplaceCtoTab(targetPath) 'Delete double-quotation

dim bkPath :bkPath = createFilePath_HeadTail( targetPath, "", "_bk" ) '変換前バックアップファイル名

With CreateObject("Scripting.FileSystemObject")
call .CopyFile(targetPath, bkPath)
end With


Dim strLine'入力用バッファ
dim oBuf '出力用バッファ

' 読み込みファイルの指定 (相対パスなのでこのスクリプトと同じフォルダに置いておくこと)
Dim input
Set input = CreateObject("ADODB.Stream")
input.Type = 2 ' 1:バイナリ・2:テキスト
input.Charset = strCode ' 文字コード指定
input.Open ' Stream オブジェクトを開く
input.LoadFromFile targetPath ' ファイルを読み込む

' 書き出しファイルの指定 (今回は新規作成する)
Dim output: Set output = CreateObject("ADODB.Stream")
output.Type = 2
output.Charset = strCode
output.Open


'◆文字列処理◆
Dim StrText
StrText = input.ReadText(-1) ' -1:全行読み込み・-2:一行読み込み
StrText = replace(StrText,",",chr(9))

output.WriteText StrText, 0 ' 0:文字列のみ書き込み・1:文字列 + 改行を書き込み

' Stream を閉じる
input.Close

' 書き出しファイルの保存
output.SaveToFile targetPath, 2 '1:指定ファイルがなければ新規作成・2:ファイルがある場合は上書き

output.Close

'ログファイルを開く
call OpenTextFileShell(targetPath)
End Sub

'------------------------------
' 出力ファイル名の生成
'------------------------------
Function createFilePath_HeadTail(targetPath ,strHead, strTail)
' const strHead = "" 'ファイル名の先頭につける文字
' const strTail = "_bk" 'ファイル名のお尻につける文字

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

dim fo: Set fo = FSO.GetFile(targetPath)
' ファイルパス分割
Dim targetDir: targetDir = FSO.GetParentFolderName(targetPath)
Dim targetBaseName: targetBaseName = FSO.GetBaseName(targetPath)
Dim targetExt: targetExt = FSO.GetExtensionName(targetPath)

' 変更後ファイルパス生成し、返却
createFilePath_HeadTail = targetDir & "\" & strHead & targetBaseName & "_" & strTail & "." & targetExt
End Function

'------------------------------
' CMDで指定したファイルを開く
'------------------------------
sub OpenTextFileShell(FulName)

Dim objWshShell
'シェルオブジェクトの作成
Set objWshShell = WScript.CreateObject("WScript.Shell")
'シェルの実行
objWshShell.Run FulName

end sub


PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字