2500Pで一括で大量にあるhtmlファイル内にある共通の文字をファイル名に変換するソフトを作るれないでしょうか。


ABC.html (<title>XXX</title>)→ A.html(<title>ABC</title>)
DEF.html (<title>XXX</title>)→ A.html(<title>DEF</title>)

何がしたいかというとhttp://q.hatena.ne.jp/1134551356 にある質問のちょうど逆で
htmlファイル内にあるタイトルタグをファイル名に書き換えたいのです。


共通の文字(XXX)を変換の際に指定できるように(つまり応用が効くように)作成してくれた方には2500P
タイトルタグの変換のみの場合は2000Pのお礼をします。
一番使いやすいソフトを作成してくれた人にお礼をさせて下さい。

宜しくお願い致します。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/09/15 16:47:46
  • 終了:2012/09/18 18:05:10
id:wano3

質問者から

wano32012/09/15 17:42:11

動作環境はwindows7 64bit です。よろしくお願いします。
書きミスしていました

ABC.html (<title>XXX</title>)→ A.html(<title>ABC</title>)
DEF.html (<title>XXX</title>)→ A.html(<title>DEF</title>)


ABC.html (<title>XXX</title>)→ ABC.html(<title>ABC</title>)
DEF.html (<title>XXX</title>)→ DEF.html(<title>DEF</title>)

またABC.html のファイル名はローマ字ではなく日本語です。

ベストアンサー

id:gizmo5 No.4

gizmo5回答回数484ベストアンサー獲得回数1382012/09/18 11:00:10

ポイント2500pt

VBScript で作成いたしました。

  1. メモ帳を開きます
  2. 回答の最後にある背景色が黒い領域の内容を、メモ帳に貼り付けます
  3. デスクトップに、文字変換.vbs というファイル名で保存します

デスクトップのアイコンに、変換したいファイル(複数可能)か、変換したいファイルがあるフォルダをドラッグ&ドロップしてください。
文字の書き換えが完了すると、「文字の変換が終了しました。」というメッセージが表示されます。

ファイルの内容を書き換えてしまうので、念のため、バックアップを取ってからお使いください。
プログラムでは、ファイルの拡張子が、.html、.HTML、.htm、.HTM のどれかになっているものを変換対象にするようにチェックしています。

フォルダではなく、複数のファイルをドラッグ&ドロップするときには、ひとつ注意点があります。
Windows の制限として、扱える長さが決まっています。
置き換えるファイルがたくさんあるようですから、ファイルを選ぶのはお試し程度にして、全部置き換えるときには、フォルダをドラッグ&ドロップするようにしてください。

置換対象の文字列として、「平尾小学校」を変えたくなった場合には、ソースの一番最初の行の平尾小学校を書き換えてください。

strTarget = "平尾小学校"



Set objRegExp = New RegExp
objRegExp.Pattern = strTarget
objRegExp.Global = True

Set objRegExpFile = New RegExp
objRegExpFile.Pattern = "\.html?$"
objRegExpFile.IgnoreCase = True

Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

Sub ChangeFileImp(objFile)
    If Not objRegExpFile.Test(objFile.Name) Then
        Exit Sub
    End If
    Set objStream = objFile.OpenAsTextStream(1)
    contents = objStream.ReadAll()
    objStream.Close()
    Set objStream = objFile.OpenAsTextStream(2)
    objStream.Write objRegExp.Replace(contents, objRegExpFile.Replace(objFile.Name, ""))
    objStream.Close()
End Sub

Sub ChangeFile(objFileName)
    Set objFile = objFS.GetFile(objFileName)
    ChangeFileImp(objFile)
End Sub

Sub ChangeFolder(objFolderName)
    Set objFolder = objFS.GetFolder(objFolderName)
    for each objFile in objFolder.Files
        ChangeFileImp(objFile)
    next
End Sub

Set objArgs = WScript.Arguments
For i = 0 to objArgs.Count - 1
    if (objFS.FolderExists(objArgs(i))) then
        ChangeFolder(objArgs(i))
    elseif (objFS.FileExists(objArgs(i))) then
        ChangeFile(objArgs(i))
    end if
Next

MsgBox "文字の変換が終了しました。"
他1件のコメントを見る
id:wano3

素晴らしい!うまくいきました!これで作業がかなり楽になりますありがとうございます!

2012/09/18 18:02:21
id:gizmo5

大量のポイントありがとうございます。
お役にたてたようで、幸いです。

2012/09/19 01:17:22

その他の回答(3件)

id:t_yamo No.1

t_yamo回答回数14ベストアンサー獲得回数32012/09/15 18:00:14

どちらかというと回答というより自分の興味で書いてみました。

Unix系なら大抵動くかなと。

【!注意!】ファイルを丸ごと書き換えてしまいますので、実際やるときは安全なところで実験してから、バックアップをとったうえで実行してください。

@下ごしらえ

対象ファイル群がある一番上のフォルダで

vi ./convX

として以下を作成。

#!/bin/sh

fname=`basename $3 $2`

sed -i "s/$1/$fname/g" $3

それの権限を変更。

chmod 755 ./convX

@変換実行

*.htmlファイル群内の文字列XXXをファイル名から.htmlを抜いた部分で置換する場合は以下。複数個XXXがあればそれら全部置換対象(XXXXといった感じの場合は先頭の合致する箇所が対象)。

find . -name "*.html" -exec ./convX XXX .html {} \;

id:wano3

すみません、プログラムの知識が全くないため全くわかりません・・・。
でも考えて下さりありがとうございます。

2012/09/15 19:33:02
id:gong1971 No.2

gong1971回答回数443ベストアンサー獲得回数682012/09/15 18:45:07

ポイント358pt

VBScriptで作成しました。

下記のコード部分をコピーし、メモ帳を開いて貼り付け、
対象となるHTMLが保存されたフォルダに「HTML.vbs」という名前で保存します。

HTML.vbsをダブルクリックすると、フォルダ内のHTMLファイルを変換します。
変換が終わると「変換完了」と表示されます。

※ファイルを書き換える為、HTMLファイルは必ずバックアップを取ってください。
※文字のエンコードなどで、うまくいかない事があるかもしれません。
 不明な点は状況をお知らせください。

Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

Set objFList = objFS.GetFolder(objWshShell.CurrentDirectory)

For Each objFile In objFList.Files
	If Right(objFile.Name, 5) = ".html" Then
		Set oTF = objFS.OpenTextFile(objFile.Name)
		tmp = oTF.ReadAll
		oTF.Close

		tmp = replace(tmp,"<title>XXX</title>","<title>" & Left(objFile.Name,Len(objFile.Name) - 5) & "</title>")
		Set oTF = objFS.OpenTextFile(objFile.Name, 2)
		oTF.Write tmp
		oTF.Close
	End If
Next

MdgBox "変換完了"
他7件のコメントを見る
id:gong1971

修正中でしたが、質問を終了されたようなので、
補足分の回答も取り止めておきますね。

返信不要です。

2012/09/18 18:49:18
id:wano3

すみません!作っていただいたソフトがうまくいって嬉しくて勢いでポイント配布してしまいました。
修正していただいていたみたいで不義理なことしてしまい申し訳ありません・・・
今後は期限を決めてこのようなことがないようにします。
本当にすみませんでした。

2012/09/18 23:43:16
id:Cherenkov No.3

Cherenkov回答回数1503ベストアンサー獲得回数4932012/09/15 20:01:56

id:Cherenkov

使い方はこれから調べます。

2012/09/15 20:02:06
id:Cherenkov

あーでもファイル名を置換文字として設定できなさそうでした。
凡ミスすみません…。

2012/09/15 20:08:36
id:wano3

質問者から

wano32012/09/16 09:16:23

後出しですみません。もうちょっと具体例を書くと

東通り.html

<meta name="robots" content="index,follow">
<meta name="Description" content="大正地区平尾小学校の年間行事を示します">
<meta name="Keywords" content="平尾小学校の周辺">
<title>大正地区 - 平尾小学校</title>
<h1>平尾小学校周辺の地図では~~~~</h1>


中央北側通り.html

<meta name="robots" content="index,follow">
<meta name="Description" content="大正地区平尾小学校の年間行事を示します">
<meta name="Keywords" content="平尾小学校の周辺">
<title>大正地区 - 平尾小学校</title>
<h1>平尾小学校周辺の地図では~~~~</h1>


ここで置換文字を「平尾小学校」に指定しファイル名にしたいんです。

東通り.html

<meta name="robots" content="index,follow">
<meta name="Description" content="大正地区東通りの年間行事を示します">
<meta name="Keywords" content="東通りの周辺">
<title>大正地区 - 東通り</title>
<h1>東通り周辺の地図では~~~~</h1>


中央北側通り.html

<meta name="robots" content="index,follow">
<meta name="Description" content="大正地区中央北側通りの年間行事を示します">
<meta name="Keywords" content="中央北側通りの周辺">
<title>大正地区 - 中央北側通り</title>
<h1>中央北側通り周辺の地図では~~~~</h1>


よろしくお願いします。

id:gizmo5 No.4

gizmo5回答回数484ベストアンサー獲得回数1382012/09/18 11:00:10ここでベストアンサー

ポイント2500pt

VBScript で作成いたしました。

  1. メモ帳を開きます
  2. 回答の最後にある背景色が黒い領域の内容を、メモ帳に貼り付けます
  3. デスクトップに、文字変換.vbs というファイル名で保存します

デスクトップのアイコンに、変換したいファイル(複数可能)か、変換したいファイルがあるフォルダをドラッグ&ドロップしてください。
文字の書き換えが完了すると、「文字の変換が終了しました。」というメッセージが表示されます。

ファイルの内容を書き換えてしまうので、念のため、バックアップを取ってからお使いください。
プログラムでは、ファイルの拡張子が、.html、.HTML、.htm、.HTM のどれかになっているものを変換対象にするようにチェックしています。

フォルダではなく、複数のファイルをドラッグ&ドロップするときには、ひとつ注意点があります。
Windows の制限として、扱える長さが決まっています。
置き換えるファイルがたくさんあるようですから、ファイルを選ぶのはお試し程度にして、全部置き換えるときには、フォルダをドラッグ&ドロップするようにしてください。

置換対象の文字列として、「平尾小学校」を変えたくなった場合には、ソースの一番最初の行の平尾小学校を書き換えてください。

strTarget = "平尾小学校"



Set objRegExp = New RegExp
objRegExp.Pattern = strTarget
objRegExp.Global = True

Set objRegExpFile = New RegExp
objRegExpFile.Pattern = "\.html?$"
objRegExpFile.IgnoreCase = True

Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objFS = WScript.CreateObject("Scripting.FileSystemObject")

Sub ChangeFileImp(objFile)
    If Not objRegExpFile.Test(objFile.Name) Then
        Exit Sub
    End If
    Set objStream = objFile.OpenAsTextStream(1)
    contents = objStream.ReadAll()
    objStream.Close()
    Set objStream = objFile.OpenAsTextStream(2)
    objStream.Write objRegExp.Replace(contents, objRegExpFile.Replace(objFile.Name, ""))
    objStream.Close()
End Sub

Sub ChangeFile(objFileName)
    Set objFile = objFS.GetFile(objFileName)
    ChangeFileImp(objFile)
End Sub

Sub ChangeFolder(objFolderName)
    Set objFolder = objFS.GetFolder(objFolderName)
    for each objFile in objFolder.Files
        ChangeFileImp(objFile)
    next
End Sub

Set objArgs = WScript.Arguments
For i = 0 to objArgs.Count - 1
    if (objFS.FolderExists(objArgs(i))) then
        ChangeFolder(objArgs(i))
    elseif (objFS.FileExists(objArgs(i))) then
        ChangeFile(objArgs(i))
    end if
Next

MsgBox "文字の変換が終了しました。"
他1件のコメントを見る
id:wano3

素晴らしい!うまくいきました!これで作業がかなり楽になりますありがとうございます!

2012/09/18 18:02:21
id:gizmo5

大量のポイントありがとうございます。
お役にたてたようで、幸いです。

2012/09/19 01:17:22
  • id:taknt
    ABC.html (<title>XXX</title>)→ A.html(<title>ABC</title>)
    DEF.html (<title>XXX</title>)→ A.html(<title>DEF</title>)

    両方とも A.htmlにしてしまうんですか?
  • id:wano3
    すみません書きミスです。
    ABC.html (<title>XXX</title>)→ ABC.html(<title>ABC</title>)
    DEF.html (<title>XXX</title>)→ DEF.html(<title>DEF</title>)
    こうでした。

    よろしくお願いします
  • id:a-kuma3
    unix 系だと、シェルスクリプトで、ちょいちょいですねえ。


    # /usr/bin/sh

    BASE_DIR=... # HTML ファイルを探す基準のディレクトリ
    TARGET_STRING=XXX # 変換対象

    for f in `find ${BASE_DIR} -type f -name "*.html -print"`
    do
    filename=`basename $f`
    mv ${f} ${f}.bak
    sed -e "s,<title>\(.*\)${TARGET_STRING}\(.*\)</title>,<title>\\1${filename}\\2</title>," ${f}.bak > ${f}
    done


    と、こんな感じかな(試してないけど)。
  • id:wano3
    すみません、プログラムが全くわからないのでシェルスクリプト自体がよく理解できません。
    考えて下さりありがとうございます

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

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

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

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