なでしこを使って,日本語でバッチを書こう!

第2回 文字列を操作してバッチを作ろう!

この記事を読むのに必要な時間:およそ 3 分

正規表現を利用する

もうひとつ,⁠なでしこ」はPerl互換の正規表現もサポートしてます。そのため,他の言語で正規表現を利用したことがあれば,そのままその知識が利用できます。

今回は,先頭に「愛読書」が入っている行だけを正規表現で抜き出してみましょう。他の言語で正規表現を利用したことのある人は,正規表現の便利さがわかるはずです※1⁠。

正規表現を使う場合の,なでしこの書式は以下の通りです。

AをBに正規表現マッチ

この場合,Bに正規表現の書式を入れてあげると,その条件にマッチしたデータが抽出されます。

リスト3 正規表現マッチで検索

#パスと言う変数にデータを放り込みます。
パス=『子供の時の愛読書は「西遊記」が第一である。これ等は今日でも僕の
愛読書である。比喩談としてこれほどの傑作は,西洋には一つもないであらうと
思ふ。名高いバンヤンの「天路歴程」なども到底この「西遊記」の敵ではない。
それから「水滸伝」も愛読書の一つである。これも今以て愛読してゐる。一時は
「水滸伝」の中の一百八人の豪傑の名前を悉く諳記(あんき)してゐたことがあ
る。その時分でも押川春浪氏の冒険小説や何かよりもこの「水滸伝」だの
「西遊記」だのといふ方が遥かに僕に面白かつた。』
検索文字とは配列
パスを反復
 対象が「^愛読書.*」に正規表現マッチ
 もしそれが空でなければ
  それを検索文字に配列追加
検索文字を言う//検索結果の表示
終わる。
※1
例えば、このサイトに正規表現が解説されています。

このプログラムを実行してみましょう。きちんと検索対象の行だけが表示されたはずです。

図3 

図3 

ファイルの入出力と連動

ここまではデータを直接プログラム内に書きましたが,既存のファイルを読み込んでその中を検索してみましょう。また,表示するだけだと忘れてしまうので,今度はテキストファイルに保存してみることにします。

ファイルを読み込む場合の,なでしこの書式は以下の通りです。

A(対象のファイル)を毎行読む。

この命令は対象のファイルを一行ずつメモリに読み込みます。ほとんどの場合,反復命令とコンビで使います。そうする事により,読み込んだ後の処理を記述する事ができます。

では,以下の『』内の文章をコピーしてメモ帳に貼り付けてください。そして,Cドライブに「aozora.txt」と言う名前で保存してください。

リスト4 外部テキストファイル「aozora.txt」

『子供の時の愛読書は「西遊記」が第一である。これ等は今日でも僕の
愛読書である。比喩談としてこれほどの傑作は,西洋には一つもないであらうと
思ふ。名高いバンヤンの「天路歴程」なども到底この「西遊記」の敵ではない。
それから「水滸伝」も愛読書の一つである。これも今以て愛読してゐる。一時は
「水滸伝」の中の一百八人の豪傑の名前を悉く諳記(あんき)してゐたことがあ
る。その時分でも押川春浪氏の冒険小説や何かよりもこの「水滸伝」だの
「西遊記」だのといふ方が遥かに僕に面白かつた。
1982/10/08』

テキストファイルが保存ができたら,以下のプログラムを作成してください。

リスト5 外部ファイルのテキストを検索

検索文字とは空//変数(検索文字)の初期化
「c:\aozora.txt」を毎行読んで反復。
 対象を「^愛読書.*」で正規表現マッチ
 もしそれが空でなければ
  それを検索文字に配列追加
検索文字を「{デスクトップ}load.txt」に保存//検索結果をデスクトップのload.txtに保存しました。
#検索文字を「C:\Users\choco\Desktop\load.txt」に保存//これでも上と同じです。
終わる。

プログラムを実行してみましょう。デスクトップ画面に「load.txt」が保存されてますので,マウスでクリックしてみてください。メモ帳が起動して,中が表示されるはずです。

文字列の置換

次は,検索した結果を自分の希望に合わせて置換をしてみましょう。例えば,以下のような書き換えをしてみることにします。

  1. 「西遊記」「孫悟空」に書き換えます。
  2. 「1982/10/08」「10月8日」に書き換えます。

文字列を置換する場合の,なでしこの書式は以下の通りです。

  1. 以下の命令は読んで字の如く、対象の文字列をそのまま置換します。
    AをBに置換。
    
  2. 以下の命令は正規表現を利用した置換ですので、正規表現の書式にマッチした文字列を置換します。
    AのBをCへ正規表現置換。
    

プログラムは以下のようになります。

リスト6 文字列を置換

「c:\aozora.txt」を毎行読んで反復
 もし,対象が「*西遊記*」にワイルドカード一致ならば
  対象の「西遊記」を「孫悟空」に正規表現置換,それを検索文字に配列追加//置換対象が見つかったら置換します。
 違えば,もし,対象が「(\d+)/(\d+)/(\d+)」に正規表現一致ならば
  対象の「(\d+)/(\d+)/(\d+)」を「$2月$3日」へ正規表現置換,それを検索文字に配列追加//置換対象が見つかったら置換します。
 違えば
  対象を検索文字に配列追加
検索文字を「{デスクトップ}load2.txt」に保存//検索結果をデスクトップのload2.txtに保存しました。
終わる。

後は,このプログラムを実行ファイルにすればOKです。

図4 

図4 

内容は,⁠aozora.txt」を読み込んで2つの項目を書き換えて「load2.txt」に上書き保存です。日本語なので処理内容は一目でわかりますし,面倒な宣言も最小限に抑えられてます。もうちょっとコンパクトにまとめたかったのですが,9行程度で収まりました。

今回は,文字列の検索と置換を説明しました。とても簡単であることがわかっていただけたと思います。いかがですか,日本語バッチ?

著者プロフィール

choco

東京情報システム株式会社 システム営業部IxDグループに所属。社内ではプロジェクトマネージャーとして日々奔走中。

4年ほど前に「なでしこ」に出会い,その魅力に取り付かれて外販用資産管理ソフトを「なでしこ」で作成。現在は,なでしこ友の会でDB接続に関するプログラムをブログで紹介中。

URLhttp://www.choco.org.uk/chocodb/