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

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

前回は、なでしこの概要と操作方法を説明しました。今回からいよいよ、なでしこでいろいろなバッチを作っていきます。

バッチ利用例で一番多いのは、やはりサーバーの設定とかバックアップですね。今回の文字列操作を覚えると、直接ファイルの読み書きができるようになるので、なでしこを使ったバッチプログラムを作成する幅が広がります。

前回の宿題の回答

「c:\windows\tmp」にある「aa.csv」をファイルサーバー「FILES」に移動させるにはどうするか、というのが前回の宿題でした。

宿題の回答、つまり、なでしこのファイル移動命令は以下のようになります。

AをBにファイル移動
「c:\windows\tmp\aa.csv」から「\\FILESV\aa.csv」へファイル移動

「ファイルコピー」の命令を「ファイル移動」の命令に置き換えるだけでした。本当にプログラミング言語らしくないですよね。でも、これが日本語プログラミング言語の魅力なんです!

コメントと変数

2回目の講義に入る前に、なでしこの基礎知識を3つほど覚えておいてほしいことがあります。

1.コメントの指定

コメントの指定には、#や//を利用します。記述例は、以下のように行頭に記号を入れるだけです。

コメントの指定(1)
#コメントです。
コメントの指定(2)
//コメントです。

2.変数の指定

変数の考え方はPHPと一緒で、宣言をしてもしなくても結構です(文の途中でいきなり書いても変数として認識します⁠⁠。

また、なでしこの変数は属性(文字列、数値等)が動的で、入る値によって属性が変動します。

以下は、変数の宣言をした場合の例です。"(変数名)とは(属性)"という形で指定します。もちろん、宣言をしなくても構いません。

変数の宣言
あああとは文字列
いいいとは整数
うううとは配列

3.インデント

なでしこは、Python等と同じで区切りをインデントで表します。タブやスペースで書いて行く訳ですが全角、半角は問いません。

以下は、インデント例です。"(スペース)コード"、"(タブ)コード"という形で指定します。例文は条件分岐ですが、もしインデントを忘れると一切条件分岐をしなくなります。

インデントの扱い方
もし、あああ=いいいならば
 「あああといいいは同じです。」と言う。
違えば
 「あああといいいは違います。」と言う。

文字列の検索

今回は、なでしこを利用して文字列の検索、置換を行います。対象のファイルは何でもいいのですが、青空文庫から芥川龍之介の「愛読書の印象」から抜粋したものを使ってみます。

ワイルドカードを利用する

まずは、なでしこを使った文字列の操作を覚えましょう。以下のプログラムをコピーして、なでしこエディタに貼りつけてください。

また、ここではパスと言う変数に入力データを放り込みます。その入力データを一行ずつ反復して取り出し、西遊記の文字列が存在する行を抜き出し、検索文字という配列変数に積み重ねていくことにします。

ワイルドカードを使う場合の、なでしこの書式は以下の通りです。

AがBにワイルドカードマッチ

この場合、Bに検索したい文字列をあいまい検索のようにワイルドカードを入れて使うと、その条件にマッチしたデータが抽出されます。

リスト1 文字列の検索
検索文字とは配列
パスとは文字列

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

パスを反復//変数(パス)の中のデータを反復して、一行づつ処理しています。
  対象が「*西遊記*」にワイルドカードマッチ
  もし、それが空でなければ
    それを検索文字に配列追加//マッチしたデータを検索文字(配列変数)に積み重ねるように追加してます。
検索文字を言う。//検索結果の表示
終わる。

このプログラムを実行すると、⁠西遊記」が含まれる行が抽出されます。⁠言う」命令を使って画面に表示させてますので、一目瞭然ですね!

図1 
図1 

複数のキーワードで検索する

次は、⁠西遊記」「天路歴程」が含まれている行だけを表示してみましょう。ワイルドカードマッチ命令は、単純に検索したい文字列にアスタリスク(*)を付けるだけなので初心者でも簡単に利用できます。

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

このプログラムを実行すると、以下のように、天路歴程と西遊記が2つとも入っている行が表示されます。

図2 
図2 

正規表現を利用する

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

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

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

AをBに正規表現マッチ

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

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

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

図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行程度で収まりました。

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

おすすめ記事

記事・ニュース一覧