前回は,なでしこの概要と操作方法を説明しました。今回からいよいよ,なでしこでいろいろなバッチを作っていきます。
バッチ利用例で一番多いのは,やはりサーバーの設定とかバックアップですね。今回の文字列操作を覚えると,直接ファイルの読み書きができるようになるので,なでしこを使ったバッチプログラムを作成する幅が広がります。
前回の宿題の回答
「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 文字列の検索
検索文字とは配列
パスとは文字列
パス=『子供の時の愛読書は「西遊記」が第一である。これ等は今日でも僕の愛読書である。比喩談としてこれほどの傑作は,西洋には一つもないであらうと思ふ。名高いバンヤンの「天路歴程」なども到底この「西遊記」の敵ではない。それから「水滸伝」も愛読書の一つである。これも今以て愛読してゐる。一時は「水滸伝」の中の一百八人の豪傑の名前を悉く諳記(あんき)してゐたことがある。その時分でも押川春浪氏の冒険小説や何かよりもこの「水滸伝」だの「西遊記」だのといふ方が遥かに僕に面白かつた。』
パスを反復//変数(パス)の中のデータを反復して,一行づつ処理しています。
対象が「*西遊記*」にワイルドカードマッチ
もし,それが空でなければ
それを検索文字に配列追加//マッチしたデータを検索文字(配列変数)に積み重ねるように追加してます。
検索文字を言う。//検索結果の表示
終わる。
このプログラムを実行すると,「西遊記」が含まれる行が抽出されます。「言う」命令を使って画面に表示させてますので,一目瞭然ですね!
なでしこ豆知識:「それ」
プログラム中の「それ」って何だろう?って思うかもしれません。「それ」とは,なでしこならではの特殊な変数で,常に前の行で実行された結果を持った変数です。
上記のプログラムの場合ですと,「対象が「*LoadModule*」にワイルドカードマッチ」の結果を持っています。
ワイルドカードによるマッチで該当行がない場合は,空が入ります。該当行が存在した場合は,「検索文字」と言う変数に結果が追加されます。「それ」は,凄く特殊で便利な変数ですので,ぜひ覚えてください。
複数のキーワードで検索する
次は,「西遊記」と「天路歴程」が含まれている行だけを表示してみましょう。ワイルドカードマッチ命令は,単純に検索したい文字列にアスタリスク(*)を付けるだけなので初心者でも簡単に利用できます。
リスト2 複数のキーワードで検索
#パスと言う変数にデータを放り込みます。
パス=『子供の時の愛読書は「西遊記」が第一である。これ等は今日でも僕の
愛読書である。比喩談としてこれほどの傑作は,西洋には一つもないであらうと
思ふ。名高いバンヤンの「天路歴程」なども到底この「西遊記」の敵ではない。
それから「水滸伝」も愛読書の一つである。これも今以て愛読してゐる。一時は
「水滸伝」の中の一百八人の豪傑の名前を悉く諳記(あんき)してゐたことがあ
る。その時分でも押川春浪氏の冒険小説や何かよりもこの「水滸伝」だの
「西遊記」だのといふ方が遥かに僕に面白かつた。』
検索文字とは配列
パスを反復
対象が「*天路歴程*西遊記*」にワイルドカードマッチ
もしそれが空でなければ
それを検索文字に配列追加
検索文字を言う//検索結果の表示
終わる。
このプログラムを実行すると,以下のように,天路歴程と西遊記が2つとも入っている行が表示されます。

