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

第4回なでしこでバッチ「繰り返し編」

前回は、なでしこを使った条件分岐を説明しました。今回は、同じ処理を何度も行うことができる「繰り返し」について説明します。

繰り返しは、他の言語で言うとFORやLOOP、while等繰り返す命令に当たります。なでしこは同等の命令を持っていますが、その記述の方法についてが中心となります。

今回利用するデータ

今回もExcelを利用します。使うデータは以下の通りですダウンロードできます⁠⁠。

図1 対象データ
図1 対象データ

基本その1:~回(FOR)

FOR基本構文は以下の通りです。

リスト1 FOR文の記述例
セル行とは整数
製品とは文字列
セル行=7
オフでエクセル起動
「{デスクトップ}book2.xls」をエクセル開く
「A2」のエクセルセル取得
製品=それ
5回
 「A{セル行}」へ製品をエクセルセル設定
 セル行=セル行+1
「{デスクトップ}book2.xls」へエクセル保存
エクセル終了。
終わる。

実行結果は、以下の図のようになります。

図2 リスト1の実行結果
図2 リスト1の実行結果

上記の場合、エクセルを不可視の状態で起動してから、特定のセル(A2)に入っている値を取得して、変数「製品」に代入します。変数「セル行」には、あらかじめ貼り付け先の行番号(7行目)を入れておきます。命令「回」を使って、5回同じ処理を繰り返すようにしてあり、常に違う行に貼付け処理を行いたいので変数「セル行」に対して、毎回1を足しています。最後に貼り付け処理を行った結果を既存「{デスクトップ}book2.xls」に保存してから、エクセルを終了させています。

気をつける点は、インデントだけです。繰り返す内容を、命令「回」と同じインデントに記述してしまうと、繰り返し処理が行われなくなりますので注意してください。

基本その2:反復(LOOP)

LOOPの基本構文は以下の通りです。

リスト2 LOOPの基本例文
セル行とは整数
製品とは配列
セル行=7
オフでエクセル起動
「{デスクトップ}book2.xls」をエクセル開く
A2からA5までエクセル一括取得
製品にそれを代入
製品を反復
 「A{セル行}」へそれをエクセルセル設定。
 セル行=セル行+1
「{デスクトップ}book2.xls」へエクセル保存
エクセル終了
終わる。

実行結果は、以下の図のようになります。

図3 リスト2の実行結果
図3 リスト2の実行結果

命令「反復」の場合、繰り返す回数は指定しません。今回の場合は、変数「製品」を配列変数として指定していることに注目してください。

コピーしたいセルの範囲を指定して、エクセル一括取得で変数「製品」にデータを代入します。そして、変数「製品」の内容を命令「反復」を利用して、一行ずつ取り出します。その後は、命令「回」の時と同じ処理になります。

基本その3:~の間(LOOP~while)

LOOP-WHILEの基本構文は以下の通りです。

リスト3 LOOP-WHILEの基本例文
セル行とは整数
製品とは配列
セル行=2
オフでエクセル起動
「{デスクトップ}book2.xls」をエクセル開く
オンの間
 「A{セル行}」のエクセルセル取得
 もしそれが空ならば
  抜ける。
 違えば
  それを製品に配列追加
 セル行=セル行+1
製品を言う。
エクセル終了
終わる。

実行結果は、以下の図のようになります。

図4 リスト3の実行結果
図4 リスト3の実行結果

命令「間」は、何らかの条件を満たすまで無限に処理を実行します。上記のオンの間とは、条件が正しいときという意味です。以下のような書き方もできます。

(カウント<5)の間

A2からA5までのセルを順番に取得して、変数「製品」に配列として追加しています。ただし、A6以降のセルには何も無いので変数「製品」には空が追加されてしまいます。それでは都合が悪いので、もし~ならば構文で命令「間」のループを抜けるようにしてます。

実際の使い方について

今回は繰り返し命令を説明しましたが、前回の「条件分岐」と違い、使うシーンが想定しづらいと思います。特に「回」については、実務で繰り返し回数があらかじめ分かっているケースがほとんどないので使いづらいです。

「反復」についてはファイルを読み込む時に、命令「毎行読む」を組み合わせるのが一般的で、配列の中身を繰り返し処理して、条件分岐させるのにも利用しますので一番わかりやすいと思います。

また、⁠間」については、使うシーンがもっとも難しいです。何かの処理が終わっているかどうかを判定するのは、マルチタスクのように並行処理を実施しているのでなければ不要ですしね。ただ、せっかくですので「間」を使った例文を一つ示しておきます。

リスト4 ⁠間」による実務バッチの例文

状況とは整数
残量とは整数
カウント=1
オンの間
 負荷=CPU使用率取得
 残量=「C:\」のディスク空きサイズ
 もし負荷が1以上ならば
  「{負荷}{改行}」を「{デスクトップ}注意.txt」に追加保存
  1秒待つ
  「{残量}{改行}」を「{デスクトップ}注意.txt」に追加保存
 0.1秒待つ
 カウント=カウント+1
 もしカウント=50ならば
  抜ける。
終わる。

このコードの実行結果は、以下のようになります。

図5 リスト4の実行結果
図5 リスト4の実行結果

上記のコードを一目見ていただくと分かると思いますが、永遠にループするのを防ぐために、変数「カウント」を利用してカウント回数が50になったら強制的に終了させてます。

そして、サーバーのCPU負荷やディスクの空き容量などをそれぞれ命令「CPU使用率取得⁠⁠、命令「ディスク空きサイズ」で取得してから、条件分岐でテキストファイルに書き出すようにしてます[1]⁠。

実際に業務でこのようなバッチを書きたい場合は、何らかのキーを押した時に「抜ける」ようにするとか、ログを書き出しているテキストファイルを毎日の日付で自動で作成させるとよいでしょう。

今回は「繰返し処理」について説明しましたが、いかがでしたでしょうか。本稿を通して、日々のバッチ的な処理が少しでも楽になれば幸いです。

おすすめ記事

記事・ニュース一覧