連載
» 2003年06月28日 05時00分 UPDATE

Tech TIPS:Windowsで複数ファイルの文字列置換をワンクリックで行う

複数のテキスト・ファイル内にある文字列を置き換えるには、一括処理するツールがあると便利である。Windowsに標準搭載されているスクリプト実行環境を利用することで、テキスト処理を自動化させることができる。置き換え文字列の指定には、固定文字列だけでなく、正規表現を使用することもできる。

[山田祥寛,著]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows NT/Windows 2000/Windows XP/Windows Server 2003



解説

 単一のテキスト・ファイルに含まれる特定の文字列を指定された文字列で置き換えることは、メモ帳などのテキスト・エディタでも十分に可能である。だが、いざ対象が複数のファイルにまたがっていると、その作業は途端に煩雑となる。いちいち個々のファイルを開いて置き換えを実行する手間はいうまでもなく、そうした冗長な手順は間違いを誘発する一因ともなる。

 しかし本サンプルの文字列一括置換ツールを利用すれば、複数のテキスト・ファイルもただドラッグ&ドロップするだけで、簡単にすべての文字列を置き換えることができる。しかも、置き換え規則には正規表現を使用できるから、より複雑な編集を行いたいといった場合にも、十分に応用が利くものであろう。

操作方法

 それではさっそく、文字列の一括置換ツールを作成してみよう。今回は、WSH(Windows Scripting Host)を使って作成してみる。仕様としては、置換ツール上にエクスプローラで対象ファイルをドラッグ&ドロップすると、自動的に文字列が置換され、元のファイルの内容が更新されるものとする。サンプル・プログラムを単純にするため、置換する文字列の指定はハード・コーディング(プログラム中に直接記述すること)するものとし、(作業中の障害に備えた)オリジナル・ファイルのバックアップなども行わないものとする。必要ならばそれらの処理は適宜追加していただきたい。

●置換ツール・プログラムの作成

 まずはテキスト・エディタ(メモ帳でもなんでもよい)を開き、以下のコードを入力して、replace.wsfという名前で保存する。/* 〜 */ で囲まれた部分は処理の内容を解説するためのコメント部分なので、省略しても構わない。

ファイル:replace.wsf

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="WordReplace">
<?job error="True" debug="True" ?>
<object id="objFs" progid="Scripting.FileSystemObject" />
<script language="JavaScript">
<![CDATA[
strRepl="Shift_JIS";   /* 置換対象文字列 */
strWith="EUC-JP";      /* 置換文字列 */
var objArg=WScript.Arguments;
  /* ドラッグ&ドロップされたファイルのパスを文字列配列として取得する。
     以下のforループでは、取得したすべてのファイルパスについて、繰り返し
     処理を行うこととする */
for(i=0;i<objArg.length;i++){
  strTmp= objFs.BuildPath (objFs.GetParentFolderName (WScript.ScriptFullName), objFs.GetTempName ());
  /* WScript#ScriptFullNameメソッドは現在実行中のファイルの絶対パスを、
     FileSystemObject#GetParentFolderNameメソッドは指定されたパスの親
     フォルダのパスを、FileSystemObject#GetTempNameメソッドはランダム
     に生成された一時ファイル名を、それぞれ取得する。
     FileSystemObject#BuildPathメソッドは第一引数に指定されたパスと第二
     引数に指定されたパスとを連結し、新たなパスを生成するので、実行中の
     ファイルが「C:\」に配置されている場合、最終的には「C:\radB940D.tmp」
     のようなパスが生成される。 */
  var objTs =objFs.OpenTextFile(objArg(i),1,false);
  var objTs2=objFs.OpenTextFile(strTmp,2,true);
/* FileSystemObject#OpenTextFileメソッドは、指定されたファイルを開き、
    TextStreamオブジェクトとして返す。ここでは、変数objTsにドラッグ&
    ドロップされたファイルが、変数objTs2には上で生成された書き込み用の
    一時ファイルが格納される */
  do{
    strLne=objTs.ReadLine();
    strLne=strLne.replace(strRepl,strWith);
    objTs2.WriteLine(strLne);
  }while(!objTs.AtEndOfStream);
/* ドラッグ&ドロップで渡されたファイルの中身を一行ずつ読み込み、
    文字列strReplが登場したら、文字列strWithで置き換える。
    これをファイルの終点まで繰り返し、その結果データを一時ファイル
    objTs2に書き込む */
  objTs.Close();
  objTs2.Close();
  objFs.DeleteFile(objArg(i));
  objFs.MoveFile(strTmp,objArg(i));
/* 置き換え処理が終了したら、元のファイル(objArg(i))を削除し、
    一時ファイルの内容をもとのファイルがあった場所にリネームして
    移動する */
}
]]>
</script>
</job>
</package>


ファイルreplace.wsfをダウンロードするには、これ をクリックして、replace.wsfというファイル名で保存してください。


 これはWSHのルールに従って記述されたXML(Extensible Markup Language)形式のファイルである。WSHはWindows環境に標準で用意されたスクリプト実行環境で、VBScript(Visual Basic Script)やJScriptなど、標準的なスクリプト言語を利用して、一連のバッチ処理を記述することができる。

 ここでは、WSHの基本に関して詳細は割愛するが、「<script>タグ(要素)」で囲まれた実際のロジック部についてのみ、簡単にコード中にコメントを付加しておいた。内部のロジックを理解しておくことで、自分自身でコードをカスタマイズする際にも役立つだろう。置換文字列を変更するには、冒頭の方にある「strRepl」と「strWith」に対する代入文の部分を変更していただきたい。

 WSHの実行ファイルは拡張子「.wsf」(Windows Script File)とする必要がある。ファイル名自体は何でもよいが、ここでは仮に「replace.wsf」という名前で保存しておこう。

●文字列一括置換ツールの実行方法

 replace.wsfを実行するには、エクスプローラでreplace.wsfの格納されたフォルダを開いておき、そのアイコン上に置き換え対象のテキストファイルをドラッグ&ドロップするだけだ。複数ファイルをドラッグ&ドロップすれば、それらは一括して処理される。

 今回の例では、テキスト・ファイル中に含まれる「Shift_JIS」という文字列が、すべて「EUC-JP」に置き換わるので、任意のテキストを用意して確認してみてほしい。もちろん、実際に利用する場合には、コード中の変数strRepl(置き換え前の文字列)、strWith(置き換え後の文字列)を目的に応じて適宜変更してから実行していただきたい。正規表現を利用する場合は、次の例のように、正規表現の前後を「/」で囲み、最後に「g」を付けておく(“g”がないと、各行につき、最初に一致する1つだけしか置換されない)。

strRepl=/[uU][nN][iI][xX]/g; /* 置換対象文字列 */
strWith="Windows";           /* 置換文字列 */



 なお、本稿では割愛するが、例えば置き換え文字列の情報をプログラム中にハード・コーディングするのではなく、別の設定ファイルとして記述できるようにすることで、より柔軟な置き換えにも対応できるようになるだろうし、再帰呼び出しなどのアルゴリズムを用いることで、ある特定のフォルダ配下にあるファイルをすべて対象にする、というようなことも考えられる。まだまだ、応用の可能性はあるので、次の機会にはさらに活用してみたい。どうぞお楽しみに。

■関連リンク


「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

編集部からのお知らせ

@IT編集部では、編集記者を募集しています。ご興味のある方は奮ってご応募ください。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。