人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

1146041654
●拡大する

●質問者: sample2
●カテゴリ:コンピュータ
✍キーワード:txt ファイル 文字列
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ken_yonezawa
●30ポイント

こんにちは。

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

Nmaery:

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

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

取り急ぎ確認まで・・・


2 ● llusall
●100ポイント ベストアンサー

ここから?ここまで

のスクリプトを 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

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

◎質問者からの返答

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


3 ●
●100ポイント

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でしたらバッチでも出来るかもしれないですね。

◎質問者からの返答

ありがとうございます。


4 ● k-watching
●70ポイント

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

以下を"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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ