1146041654 test0001.txt~test9999.txt という9999個のファイルがあり、その内容は ***test0001*** となっています。いま、ファイル内の test0001 という文字列を全てファイル名にあわせて書き換えたいと思います。なるべく楽な方法を教えてください。

回答の条件
  • 1人5回まで
  • 登録:2006/04/26 17:54:16
  • 終了:2006/04/27 10:54:26

ベストアンサー

id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/04/26 19:47:25

ポイント100pt

ここから~ここまで

のスクリプトを Replace.vbs 等の名前でデスクトップに配置してください。

■印のフォルダを書き換えてください。

Replace.vbs のアイコンに置換対象のファイルをドラッグ&ドロップしてください。

■印のフォルダに置換されて保存されます。

※必要に応じてカスタマイズしてみてください。

※一度に複数ファイルをドロップできますが、いくつまで大丈夫かは不明です。


'ここから-----------------------------------------------------------------------------

Option Explicit

Const FOLDER = "C:\DEKIMASITA" '■置換したファイルを入れる場所

Call Main()

Sub Main()

Dim objArgs

Dim i

Dim nArgCnt

Dim bRtn

Dim sResultFile, sPath

Dim sFname

Dim objFS, objTXT, objTXT2, sLine

Err.Clear

'コマンドライン引数の有無チェック

Set objArgs = WScript.Arguments

nArgCnt = objArgs.Count

If nArgCnt = 0 Then

MsgBox "アイコンにファイルをドラッグ&ドロップしてください。", vbExclamation

Exit Sub

End If

Set objFS = CreateObject("Scripting.FileSystemObject")

If objFS.FolderExists(FOLDER) Then

Else

objFS.CreateFolder (FOLDER)

End If

'ファイル数の処理を実行

For i = 0 To nArgCnt -1

sPath = objArgs(i)

sFname = objFS.GetBaseName(sPath)

Set objTXT = objFS.OpenTextFile( sPath, 1, False )

Set objTXT2 = objFS.CreateTextFile( FOLDER & "\" & sFname & ".txt" , True )

Do Until objTXT.AtEndOfStream

sLine = objTXT.ReadLine

sLine = Replace(sLine,"test0001",sFname)

objTXT2.WriteLine(sLine)

Loop

objTXT.Close

Set objTXT = Nothing

objTXT2.Close

Set objTXT2 = Nothing

Next

MsgBox "おしまい。", vbInformation

End Sub

'ここまで-----------------------------------------------------------------------------

id:sample2

ありがとうございます。説明不足ですみません。置換文字列の前後はファイルごとに異なるため、ちょっとうまくいきませんでした。

2006/04/27 10:51:07

その他の回答(3件)

id:ken_yonezawa No.1

ken_yonezawa回答回数96ベストアンサー獲得回数22006/04/26 19:20:50

ポイント30pt

こんにちは。

若干、画像が確認しにくいのですがファイル名変換ですか?

Nmaery:

http://www.vector.co.jp/soft/win95/util/se217399.html

全然的を得てないモノならポイント不要です。

取り急ぎ確認まで・・・

id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612006/04/26 19:47:25ここでベストアンサー

ポイント100pt

ここから~ここまで

のスクリプトを Replace.vbs 等の名前でデスクトップに配置してください。

■印のフォルダを書き換えてください。

Replace.vbs のアイコンに置換対象のファイルをドラッグ&ドロップしてください。

■印のフォルダに置換されて保存されます。

※必要に応じてカスタマイズしてみてください。

※一度に複数ファイルをドロップできますが、いくつまで大丈夫かは不明です。


'ここから-----------------------------------------------------------------------------

Option Explicit

Const FOLDER = "C:\DEKIMASITA" '■置換したファイルを入れる場所

Call Main()

Sub Main()

Dim objArgs

Dim i

Dim nArgCnt

Dim bRtn

Dim sResultFile, sPath

Dim sFname

Dim objFS, objTXT, objTXT2, sLine

Err.Clear

'コマンドライン引数の有無チェック

Set objArgs = WScript.Arguments

nArgCnt = objArgs.Count

If nArgCnt = 0 Then

MsgBox "アイコンにファイルをドラッグ&ドロップしてください。", vbExclamation

Exit Sub

End If

Set objFS = CreateObject("Scripting.FileSystemObject")

If objFS.FolderExists(FOLDER) Then

Else

objFS.CreateFolder (FOLDER)

End If

'ファイル数の処理を実行

For i = 0 To nArgCnt -1

sPath = objArgs(i)

sFname = objFS.GetBaseName(sPath)

Set objTXT = objFS.OpenTextFile( sPath, 1, False )

Set objTXT2 = objFS.CreateTextFile( FOLDER & "\" & sFname & ".txt" , True )

Do Until objTXT.AtEndOfStream

sLine = objTXT.ReadLine

sLine = Replace(sLine,"test0001",sFname)

objTXT2.WriteLine(sLine)

Loop

objTXT.Close

Set objTXT = Nothing

objTXT2.Close

Set objTXT2 = Nothing

Next

MsgBox "おしまい。", vbInformation

End Sub

'ここまで-----------------------------------------------------------------------------

id:sample2

ありがとうございます。説明不足ですみません。置換文字列の前後はファイルごとに異なるため、ちょっとうまくいきませんでした。

2006/04/27 10:51:07
id:bonlife No.3

回答回数421ベストアンサー獲得回数752006/04/27 00:19:37

ポイント100pt

Linux環境があれば、シェルで行えば良いと思います。

Windows環境しかない場合、cygwin、SFUを導入すればシェルを使うことができます。

私はcygwinのbashで試してみました。

(SFUの場合、cshかkshになるので書き直しが必要です。)

9999個のファイルと同じディレクトリにて以下の内容に適当な名前をつけて実行してみてください。

#! /bin/sh
# ファイルリストの取得 (testで始まり.txtで終わるファイル)
find . -name "test*.txt" -print > file_list.dat
# ファイルリストの行数から対象ファイル数を取得
file_number=`cat file_list.dat | wc -l`
# 繰り返し処理
i=1
while [ $i -le $file_number ]
do
  # ファイルリストから1行ずつファイル名を取得
  file_name=`awk "NR==$i {print;}" file_list.dat | cut -c3-14`
  # ファイル名から拡張子を削除したものを変数に保存
  file_name2=`echo $file_name | cut -c1-8`
  # ファイルをバックアップ
  cp -p $file_name $file_name".bkup"
  # ファイル中のtest0001をファイル名から拡張子を削除したものに置換し、元のファイルに上書き保存
  sed "s/test0001/$file_name2/g" $file_name.bkup > $file_name
  i=`expr $i + 1`
done

既存のツールで完全に実現できることをあえてシェルでやる必要はないと思いますが、ちょっとしたことだけどピッタリのツールがない場合など、シェルやPerlで処理をすると便利です。

参考になれば幸いです。

とここまで書いて気付きましたが、Windowsでしたらバッチでも出来るかもしれないですね。

id:sample2

ありがとうございます。

2006/04/27 10:51:18
id:k-watching No.4

k-watching回答回数4ベストアンサー獲得回数02006/04/27 09:16:01

ポイント70pt

書き換えではなく上書きになってしまいますが…

以下を"test.vbs"とでも保存して、実行してください。新規に9999個のファイルを作成します。


dim i

dim fnm

dim fso

dim ctf

set fso = CreateObject("Scripting.FileSystemObject")

for i = 1 to 9999

fnm = "test" & right("000" & trim(i), 4)

Set ctf = fso.OpenTextFile(fnm & ".txt", 2, true)

ctf.WriteLine("***" & fnm & "***")

next

id:sample2

ありがとうございます。残念ながら連番とは決まっていないことと、置換文字列の前後もファイルごとに異なります。

2006/04/27 10:52:53
  • id:sample2
    llusall さんのご回答につけたコメントは勘違いで書いたものです。いるか賞をつけているように、実際にはうまくいっています。
    bonlife さんのご回答も完璧だったのですが、会社のパソコンの大半は cygwin が入っておらず、また勝手に入れることもできないため、llusall さんご提案のスクリプトを利用させていただくことにしました。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません