仮に”A001.txt”、”A002.txt”、”A003.txt”・・・と1000ファイルあるとして、それぞれのテキストファイル内に”[ファイル名]”という特定文字があった場合、自身のファイル名を取得して置換する方法を探しています。
A001.txt内”[ファイル名]”→”[A001.txt]”、A002.txt内”[ファイル名]”→”[A002.txt]”といった具合に一括で処理することが希望です。
WSH(VBScript)です。
こちらでいけないでしょうか?
メモ帳などのエディタに貼り付けて、※の部分を書き替え
ファイルの置換.vbs
のようなファイル名で保存します。(拡張子をvbsにする事)
ダブルクリックすると実行されます。
また、エクセルVBAの関数の一部としても使用できます。
その場合は
「WScript.」を除去してください。
Option Explicit Const TARGET_FOLDER = "D:\TEMP" '※フォルダを指定 Const REPLACE_FROM = "[ファイル名]" '※置換前文字列 Dim REPLACE_TO ' 置換後文字列 Const ForReading = 1 '読み込み Const ForWriting = 2 '書きこみ(上書きモード) Const ForAppending = 8 '書きこみ(追記モード) Dim strFilePath, infile, outfile, strData, strExt Dim objFSO, objFolder, objFile, objSubFolder, objTXT Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder(TARGET_FOLDER) For Each objFile In objFolder.Files strFilePath = objFSO.BuildPath(TARGET_FOLDER, objFile.Name) strExt = objFSO.GetExtensionName(objFile.Name) If LCase(strExt) = "txt" Then Set infile = objFSO.OpenTextFile(strFilePath,ForReading) strData = infile.ReadAll infile.Close Set infile = Nothing Set outfile = objFSO.OpenTextFile(strFilePath,ForWriting) '(上書き) REPLACE_TO = "[" & objFile.Name & "]" '※自身のファイル名 outfile.Write Replace(strData,REPLACE_FROM,REPLACE_TO) outfile.Close Set outfile = Nothing End If Next Set objFolder = Nothing Set objFSO = Nothing MsgBox "終了", vbInformation
Emacsを使って試してみたら出来たので報告します。
条件:編集するファイルは全て一箇所のフォルダに入っているものとします。
Emacsを軌道してC-x C-fとして、上記のフォルダを指定してdiredモードに入ります。
ここでキーボードマクロの定義します。
C-x (でキーボードマクロの定義に入り、一覧からファイル名をコピーして、ファイルを開けて、
テキストの置換(replace-string)を実行し、ファイル名に置換します。ファイルをSave(C-x C-s)、
Kill(C-x k)してdiredモードに戻り次のファイル名の先頭に移動(C-n)して、
C-x )でキーボードマクロ定義を終了します。
一度このキーボードマクロが上手く定義できれば、あとは、
C-x eでマクロを繰り返すことができますし、
C-u 1000 C-x eで上記マクロを1000回繰り返すことも出来ます。
ちなみに定義したマクロは下記のようになりました。
C-SPC ;; set-mark-command
C-e ;; move-end-of-line
ESC w ;; kill-ring-save
RET ;; newline
ESC x ;; execute-extended-command
replace ;; self-insert-command * 7
2*TAB ;; indent-for-tab-command
st ;; self-insert-command * 2
TAB ;; indent-for-tab-command
RET ;; newline
[ファイル名] ;; self-insert-command * 7
RET ;; newline
C-y ;; yank
RET ;; newline
C-x C-s ;; save-buffer
C-x k ;; kill-buffer
RET ;; newline
C-n ;; next-line
WSH(VBScript)です。
こちらでいけないでしょうか?
メモ帳などのエディタに貼り付けて、※の部分を書き替え
ファイルの置換.vbs
のようなファイル名で保存します。(拡張子をvbsにする事)
ダブルクリックすると実行されます。
また、エクセルVBAの関数の一部としても使用できます。
その場合は
「WScript.」を除去してください。
Option Explicit Const TARGET_FOLDER = "D:\TEMP" '※フォルダを指定 Const REPLACE_FROM = "[ファイル名]" '※置換前文字列 Dim REPLACE_TO ' 置換後文字列 Const ForReading = 1 '読み込み Const ForWriting = 2 '書きこみ(上書きモード) Const ForAppending = 8 '書きこみ(追記モード) Dim strFilePath, infile, outfile, strData, strExt Dim objFSO, objFolder, objFile, objSubFolder, objTXT Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder(TARGET_FOLDER) For Each objFile In objFolder.Files strFilePath = objFSO.BuildPath(TARGET_FOLDER, objFile.Name) strExt = objFSO.GetExtensionName(objFile.Name) If LCase(strExt) = "txt" Then Set infile = objFSO.OpenTextFile(strFilePath,ForReading) strData = infile.ReadAll infile.Close Set infile = Nothing Set outfile = objFSO.OpenTextFile(strFilePath,ForWriting) '(上書き) REPLACE_TO = "[" & objFile.Name & "]" '※自身のファイル名 outfile.Write Replace(strData,REPLACE_FROM,REPLACE_TO) outfile.Close Set outfile = Nothing End If Next Set objFolder = Nothing Set objFSO = Nothing MsgBox "終了", vbInformation
希望通りの事ができました。ありがとうございました。
希望通りの事ができました。ありがとうございました。