EXPRML 複数行レコードをTSEXPRで計算

書法

EXPRML expr [filename]* [option]*

SHELLMODE

@記述、!記述、^記述、#記述

詳細

第一パラメータをTSEXPR式の連続として解釈して、 入力ファイルの各レコードに対して計算し、標準出力する。
ファイル名を省略すると標準入力を扱う。
通常は式の値を常に出力するが、出力を抑制する検定モードを指定できる(-P)。

 ここで扱うレコードは、その要素が行で、複数行からなる。レコードの範囲は、デフォルトでは空行を区切りとする。
 空行を区切りとする方法では、空行の連続は一つの空行と同じものとみなす。また、長さ0の行以外に、半角スペースだけの行も空行とする、あるいは、半角スペースと制御コードだけの行を空行とする指定が出来る。

式記述

{ TSEXPR式; }+
TSEXPR式を;で区切って第一パラメータに記述する。
アプリケーション・インタフェース
引数略記変数名説明
0 @0 ??rec 行を連結した文字列。各行末には0x0aが付いている。
1以上 @n 1から順に項目に対応
-1 &(-1) ??grn 通算レコード番号
-2 &(-2) ??rn ファイル内レコード番号
-3 &(-3) ??fn ファイル番号
-4 @(-4) ??filename 処理中のファイル名
-5 &(-5) ??fc 項目数
??print 出力の許可状態を表す論理値。 行の計算式、初期化式などそれぞれの場合に固有である。
??print := bool
この変数に論理値を代入することで出力の可否を制御できる。

 標準では、各式の間に改行を挟み、さらに、レコード末では2回の改行を行う。すなわち、レコード末に空行を一つ挟む。また、レコード末の空行の出力は極力抑制される。

動作モード

通常モード
入力行数と同じ行だけ常に出力する。
出力は項目ごとに改行を出力する。各項目には、先頭から順に式の値が対応する。
検定モード
検定モードでは、第一式が検定式となり、この式の値がTRUEになる行だけを出力する。 従って、第一式の型は論理型であること。
出力は改行ファイルで項目ごとに改行する。各項目には、第二式から順に式の値が対応する。

入力レコードの構成

 複数行をまとめた入力レコードは、以下の6種類の方法で決める(-M)。

空行で区切る -MZ
-MS
-MC

 デフォルトの処理である。一行以上の空行の連続をレコードの区切りとする。空行の定義法を指定するサブモードがある。

  1. 空行は長さ0の文字列(-MZ)。デフォルト。
  2. 半角スペースだけの行も空行とみなす(-MS)。
  3. 半角スペースと制御コードだけの行も空行とみなす(-MC)。
行数を指定 -MFn

 指定した行数を1件のレコードにまとめる。
ファイル末に半端な行がある場合の扱いは以下の三種類がある。

  1. 要素の足りない1件として扱う(デフォルト)。
  2. 半端な行があるレコードは捨てる(-AF)。
  3. 足りない行を補完する(-AC)。
開始行と終了行を指定 -MHexpr
-MTexpr

 -MHで指定する tsexpr で開始行を判定し、真になったら、-MTで指定する tsexpr で終了行を判定する。開始行から終了行までを1件のレコードにまとめる。
 デフォルトでは、開始行、終了行はレコードに入るが、オプション(-AH-AT)で、それぞれを、レコードに組み入れない指定ができる。

開始行を指定 -MHexpr

 -MHで指定する tsexpr が真になった行を開始行とし、次の開始行の手前か、ファイル末までを1件のレコードとする。
 開始行はレコードに入るが、オプション(-AH)でレコードに組み入れない指定ができる。

終了行を指定 -MTexpr

 -MTで指定する tsexpr が真になるまでを1件のレコードとする。従って、最後の終了行より後の行は無視する。
 終了行はレコードに入るが、オプション(-AT)でレコードに組み入れない指定ができる。

条件にあった連続行を1件とする -MEexpr

 -MEで指定した tsexpr が真である行の連続を1件のレコードとする。

 開始行、終了行、連続行の判定に用いる tsexp は、論理値を返すものとする。
式記述の最後に「;」を付加しないことに注意すること。

アプリケーション・インタフェース
引数略記変数名説明
0 @0 ??line 判定対象の行
-1 &(-1) ??grn 通算レコード番号
-2 &(-2) ??rn ファイル内レコード番号
-3 &(-3) ??fn ファイル番号
-4 @(-4) ??filename 処理中のファイル名
bool SPOOL(str 文字列 ) 文字列を直接出力する。

OPTION

-A{H|T}[+|-]
開始行行、終了行をレコードに含めるかを決める。デフォルトではいずれの行も含まれる。
-AH+ヘッダーを含める。
-AH-AH-ヘッダーを含めない。
-AT+トレイラーを含める。
-AT-AT-トレイラーを含めない。
-ACstr
固定行数(-MF)でファイル末の半端な行を補完する。 補完する内容は str で指定できる。
-AF
固定行数(-MF)でファイル末の半端な行は無視する。
-B{tsexpr;}+
ファイル処理の最初に実行する式を書く。各式は「;」で区切る。
-E{tsexpr;}+
ファイル処理の最後に実行する式を書く。各式は「;」で区切る
-F{tsexpr;}+
全体の処理の最後に実行する式を書く。各式は「;」で区切る。
-I{tsexpr;}+
処理の最初に実行する式を書く。各式は「;」で区切る。デフォルトでは出力しない。
-L{S|C|L}
1行を入力する際のコードの扱いを指定する。
-LSデフォルト。不要のコードを除去。LFを行末とみなす。CRは無視する。
-LCコードの変更をしない。CRLFを行末として扱う。
-LLコードの変更をしない。LFを行末として扱う。
-Mmode
入力レコードの範囲の決め方。
-MC 空行区切り。空行は長さ0の行。
-MS 空行区切り。半角スペースだけの行も空行扱いする。
-MZ 空行区切り。半角スペースと制御コードだけの行も空行扱いする。
-MFnum 指定の行数
-MHbool式 TSEXPRが真である行を開始行とする。
-MTbool式 TSEXPRが真である行を終了行とする。
-MEbool式 TSEXPR式が真である連続行をまとめてレコードとする。
-NOEOL
出力時にレコード末の改行を抑制する。(レコード末での改行の刈り込みも行わない)
-Ofilename
出力を指定のファイルに切替える。
-P
検定モードに切り替える
-Rstr
出力用のレコード区切りコードを指定する。正規表現で書く。デフォルトは、空行を出力するために二つの復帰改行 (\r\n\r\n)に設定されている。
-S[+|-]
各行の出力を抑制する(-S、-S+)。または、抑制を解除する(-S-)。
-SB[+|-]
ファイル開始処理の出力を抑制する(-SB、-SB+)。または、抑制を解除する(-SB-)。
-SE[+|-]
ファイル開始処理の出力を抑制する(-SE、-SE+)。または、抑制を解除する(-SE-)。
-SI[+|-]
全体の開始処理の出力を抑制する(-SI、-SI+)。または、抑制を解除する(-SI-)。
-SF[+|-]
全体の終了処理の出力を抑制する(-SF、-SF+)。または、抑制を解除する(-SF-)。
-Tstr
出力用の項目区切りコードを指定する。正規表現で書く。デフォルトは 復帰改行 (\r\n)。
-V
式の値はそのまま出力するようにする。
式の値(文字列)を出力するときには、復帰(\r)を無視し、改行(\n)を復帰改行(\r\n)に変換しているが、これをやめてそのまま出力する。
-X
出力を項目数固定モードにする。一項目が一行に相当するようになる。このため、レコード区切りを復帰改行(\r\n)に変更する。

用例

参考

バージョン

Ver 1.042012/06/26 -L で入力行の扱いを変更できるようにした。
Ver 1.032012/04/30 初期化/終了化でのcallback変更
外部変数 ??print を導入
Ver 1.022012/04/29 固定行モードで行の補完サポート
Ver 1.012012/04/21 処理中断時の空読み処理を改善
Ver 1.00初版