テキスト置換について質問です。

仮に”A001.txt”、”A002.txt”、”A003.txt”・・・と1000ファイルあるとして、それぞれのテキストファイル内に”[ファイル名]”という特定文字があった場合、自身のファイル名を取得して置換する方法を探しています。
A001.txt内”[ファイル名]”→”[A001.txt]”、A002.txt内”[ファイル名]”→”[A002.txt]”といった具合に一括で処理することが希望です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/05/05 14:17:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:HALSPECIAL No.2

回答回数407ベストアンサー獲得回数86

ポイント70pt

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

http://q.hatena.ne.jp/1255144176#a956818

id:WATANABE

希望通りの事ができました。ありがとうございました。

2010/05/05 14:17:13

その他の回答3件)

id:nobnob3 No.1

回答回数326ベストアンサー獲得回数29

ポイント5pt

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

id:HALSPECIAL No.2

回答回数407ベストアンサー獲得回数86ここでベストアンサー

ポイント70pt

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

http://q.hatena.ne.jp/1255144176#a956818

id:WATANABE

希望通りの事ができました。ありがとうございました。

2010/05/05 14:17:13
id:Committeeman No.3

回答回数153ベストアンサー獲得回数19

ポイント10pt

こちらの記事が参考になると思います

http://itpro.nikkeibp.co.jp/article/COLUMN/20091124/340923/?ST=d...

id:brandbaidu No.4

回答回数24ベストアンサー獲得回数0

ポイント10pt

(はてなにより削除しました)

  • id:nobnob3
    http://q.hatena.ne.jp/1273073649
    これもEmacsのキーボードマクロでできるけど、Emacsは駄目ですよね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません