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

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

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

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

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

前回の宿題の回答

「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 

なでしこ豆知識:「それ」

プログラム中の「それ」って何だろう?って思うかもしれません。「それ」とは,なでしこならではの特殊な変数で,常に前の行で実行された結果を持った変数です。

上記のプログラムの場合ですと,「対象が「*LoadModule*」にワイルドカードマッチ」の結果を持っています。

ワイルドカードによるマッチで該当行がない場合は,空が入ります。該当行が存在した場合は,「検索文字」と言う変数に結果が追加されます。「それ」は,凄く特殊で便利な変数ですので,ぜひ覚えてください。

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

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

リスト2 複数のキーワードで検索

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

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

図2 

図2 

著者プロフィール

choco

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

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

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

コメント

コメントの記入