3. 項目名

mcmdはデータの列を名前(項目名)で扱うこともできるし、項目名なしのデータも扱うことができる。 本節では、データ上の項目名に関するルール、及びmcmdメソッドでの項目の指定方法について説明する。

3.1. 利用可能文字

項目名として利用可能な文字は以下の通りである。

  • マルチバイト文字 (UTF-8 など)

  • アルファベット (a-z,A-Z)

  • 数字 (0-9)

  • 半角記号

ただし、半角記号については、以下の 9 つの利用は避けることを推奨する。 利用してエラーとなるわけではないが、 いずれも mcmd の中で項目指定時の特殊文字として利用しており、 その特殊用途を利用できなくなる可能性があるからである。

  • , カンマ

  • : コロン

  • % パーセント

  • * アスタリスク

  • ? クエスチョンマーク

  • & アンド

  • \ バックスラッシュ

  • ] 四角括弧右

  • [ 四角括弧左

3.2. 項目名ヘッダー上のソーティング情報

mcmdで k= にてキー項目を指定できるメソッドの多くは、内部でキー項目による並べ替え処理を行っている。 そして、その時、既に指定の項目で並び替わっていれば、並べ替え処理はスキップされる。 その判断は、項目名ヘッダーに付帯する情報によって判断している。 その書式は以下に示される通り、項目名に続き % を区切り文字にしてソーティング情報が示される。

項目名%[優先順位][数値/文字][昇順/降順]

優先順位: 並べ替え項目として指定した順に 0,1,2,...の番号が振られる。

数値/文字: 数値として並べ替えたのか、文字列として並べ替えられたかが示される。n が示されていれば数値としてソートされており、なければ文字列としてソートされている。

昇順/降順: 昇順か降順かが示される。r が示されていれば降順でソートされており、なければ昇順でソートされている。

これらのソート情報は、データを出力するメソッドが自動的に付加するものである。 msortf メソッドを使用して項目の並べ替えを行った場合や、 mnumber メソッドで k=s= を指定した場合である。 以下に例として、a,b,c,d の4項目の入力データに対するいくつかの処理結果を示しておく。

実行メソッド

出力の項目名ヘッダー

nm.mcut(f="a,b,c,d",i=dat).run()

a,b,c,d

nm.msortf(f="a,b,c",i=dat).run()

a%0,b%1,c%2,d

nm.msortf(f="b,c,a",i=dat).run()

a%2,b%0,c%1,d

nm.msortf(f="d,b",i=dat).run()

a,b%1,c,d%0

nm.msortf(f="a%r,b%n,c%rn",i=dat).run()

a%0,b%1r,c%2n,d

nm.mnumber(k="a", s="b%nr",i=dat).run()

a%0,b%1nr,c,d

なお、項目名の並べ替え情報と実際のデータの並び順が整合していない場合、メソッドの動作は不定となる。 このようなケースがあり得るのは、実際には並べ替えられていないのに、人為的に項目名に%0 を付加したり、 項目名に%が含まれているデータを扱うなどである。

3.3. 入力項目と出力項目

多くのコマンドで項目の指定には f= が利用される。 f= の書式は、「入力項目:出力項目」で、出力項目の指定を省略すれば、 入力項目名が出力項目名として利用される。 リスト 3.1 では、 mcut により、 val 項目は frequency という名前に変更されて出力される。

リスト 3.1 入力と出力で項目名を変更する例
 1import nysol.mcmd as nm
 2dat=[
 3["key","val"],
 4["a",2],
 5["b",5],
 6["b",4]
 7]
 8
 9nm.mcut(f="key,val:frequency",i=dat,o="rsl.csv").run()
10# key,frequency
11# a,2
12# b,9

リスト 3.2 では、 maccum が、 val 項目の累計を計算し、追加項目 accum として出力し、 key,val,accum の3項目が出力される。

リスト 3.2 入力と出力で項目名を変更する例
1nm.maccum(f="val:accum", i=dat.csv).run()
2# key,val,accum
3# a,2,2
4# b,5,7
5# b,4,11

3.4. ワイルドカード

mcmdメソッドで、複数項目を指定する際には、項目名に *? のワイルドカードを利用することができる。 * は任意の長さの任意の文字列にマッチし、 ? は任意の1文字にマッチする。 また、ワイルドカードの評価順は入力データ上の項目の並び順となることに注意する。 例えば、入力データの項目の並びが、A5,A3,A4,A2,A1 であれば、 f=A*f=A5,A3,A4,A2,A1 と評価される。 リスト 3.3 に例を示す。

リスト 3.3 ワイルドカードを用いた項目名指定
 1import nysol.mcmd as nm
 2dat=[
 3["item","f09","f10","f11","f123"],
 4["A",1,2,3,4]
 5["B",3,2,1,0]
 6]
 7
 8# fで始まる項目名を指定
 9nm.mcut(f="f*", i=dat.csv,o=rsl.csv).run()
10# rsl.csvの内容
11# f09,f10,f11,f123
12# 1,2,3,4
13# 3,2,1,0
14
15# f1で始まり任意の1文字が続く項目名(f10,f11)を指定
16nm.mcut(f="f1?", i=dat.csv, o="rsl.csv").run()
17# f10,f11
18# 2,3
19# 2,1

3.5. 出力項目名の置換

出力項目名に指定された & は特殊な意味を持ち、入力項目名に置換される。 例えば、 f=abc:xx&xx では、出力項目名は xxabcxx に置換される。 & は、出力項目名の任意の位置に指定することができ、またその指定数に制限はない。 リスト 3.4 に例を示す。

リスト 3.4 出力項目名の置換の例
 1import nysol.mcmd as nm
 2dat=[
 3["item","f09","f10","f11","f123"],
 4["A",1,2,3,4]
 5["B",3,2,1,0]
 6]
 7nm.mcut(f="item:&_code", i=dat.csv, o="rsl.csv")
 8# rsl.csvの内容
 9# item_code,f09,f10,f11,f123
10# A,1,2,3,4
11# B,3,2,1,0

ワイルドカードの指定においても出力項目名の置換は可能である。 ワイルドカードを全て展開し、それらの項目全てに同じ置換のルールが適用される。 リスト 3.5 では、ワイルドカード f*f09,f10,f11,f123 に展開され、 それぞれについて g_& の置換ルールが適用され g_f09,g_f10,g_f11,g_f123 に展開される。

リスト 3.5 出力項目名の置換の例
 1import nysol.mcmd as nm
 2dat=[
 3["item","f09","f10","f11","f123"],
 4["A",1,2,3,4]
 5["B",3,2,1,0]
 6]
 7nm.mcut(f="f*:g_&", i=dat.csv, o="rsl.csv")
 8# rsl.csvの内容
 9# g_f09,g_f10,g_f11,g_f123
10# 1,2,3,4
11# 3,2,1,0

3.6. 項目名ヘッダーなしでの利用

mcmdは項目名以外にも、項目番号によって項目を指定することが可能である。 項目番号による扱いに関係するパラメータは nfn= , nfno= , nfni= , x= の4つある。 以下では、例を示しながら、その利用方法について説明する。 なお、項目番号は左から 0,1,2 のように 0 から始まることに注意する。 また、項目番号の指定は、整数ではなく文字列で与えなければならない。

nfn=

nfn=True (no field name) を指定すると、入力データの先頭行を項目名ヘッダーと見なさず、また項目名ヘッダーを出力もしない。 リスト 3.6 では、 項目名ヘッダーのないデータ dat について、 msum では nfn=True を指定することで項目番号によって項目を指定している。

リスト 3.6 nfn=True で項目番号で項目を指定する例
 1import nysol.mcmd as nm
 2dat=[
 3["a",2],
 4["b",5],
 5["b",4]
 6]
 7
 8nm.msum(nfn=True,k="0",f="1",i=dat).run()
 9# a,2
10# b,9

nfno=

nfno= (no field name for output) を指定すると,入力データの先頭行は項目名行として扱うが、 出力データには項目名を出力しない。 リスト 3.7 では、 msum の結果には項目名ヘッダーが出力されていないので、 続く mcut では nfn=True を指定して項目番号で項目を指定している。

リスト 3.7 nfno=True で項目番号で項目を指定する例
 1import nysol.mcmd as nm
 2dat=[
 3["key","val"],
 4["a",2],
 5["b",5],
 6["b",4]
 7]
 8
 9nm.msum(nfno=True,k="key",f="val",i=dat).mcut(nfn=True,f="0,1").run()
10# a,2
11# b,9

nfni=

nfni= (no field name for input) は mcut でのみ指定可能なオプションである。 このオプションは nfno= と逆の働きをする。 すなわち,入力データの先頭行は項目名行として扱わないが,出力データには項目名を出力する。 出力データの項目名は f= で項目番号に続けて : で区切って指定する。 リスト 3.8 の例では、 mcut により、0番目1番目の項目に key, val という項目名を付け、 続く msum では、項目名により項目を指定している。

リスト 3.8 nfni=True で項目番号で項目を指定する例
 1import nysol.mcmd as nm
 2dat=[
 3["a",2],
 4["b",5],
 5["b",4]
 6]
 7
 8nm.mcut(nfni=True,f="0:key,1:val",i=dat).msum(k="key",f="val").run()
 9# a,2
10# b,9

-x

項目名行があるデータに対して、項目番号で指定したい場合は x= オプションを利用する。 リスト 3.9 の例では、 入力データは項目ヘッダーがあるが、 msum では項目番号により項目を指定し、 続く mcut では項目名により項目を指定している。 このように x= を指定すれば、入出力ともに項目ヘッダー付きのデータを扱うことになるが、項目指定のみ項目番号で行うことができるようになる。

リスト 3.9 x=True で項目番号で項目を指定する例
 1import nysol.mcmd as nm
 2dat=[
 3["key","val"],
 4["a",2],
 5["b",5],
 6["b",4]
 7]
 8
 9nm.msum(x=True,k="0",f="1",i=dat).mcut(f="key,val").run()
10# a,2
11# b,9

多様な項目番号の指定方法

項目番号の指定では、単純に項目番号をカンマで区切って列挙する以外にも、 後ろの項目からの番号指定 ("L"を付 ける) や範囲 (-) を指定することが可能である。 例えば 0L とすれば、最後の項目を指定したことになり、2L とすれば、 最後から数えて2番目の項目 (0 番から始まることに注意) を指定したことになる。 また 0-5 と指定すれば、0 番項目 から 5 番項目まで 6 つの項目を指定したことになる。 すなわち 0,1,2,3,4,5 と指定したことと同等である。 リスト 3.10 にいくつかの例を示す。

リスト 3.10 項目番号を範囲や末尾から指定する例
 1import nysol.mcmd as nm
 2dat=[
 3["item","f01","f02","f03","f04","f05","f06","f07","f08","f09","f10"],
 4["A",1,2,3,4,5,6,7,8,9,10]
 5["B",9,8,7,6,5,4,3,2,1,0]
 6]
 7
 8# 0-4で0,1,2,3,4を指定したことになる
 9nm.mcut(x=True,f="0-4",i=dat.csv).run()
10# [["A",1,2,3,4],["B",9,8,7,6]]
11
12# 4-0で4,3,2,1を指定したことになる
13nm.mcut(x=True,f="4-0",i=dat.csv).run()
14# [[4,3,2,1,"A"],[6,7,8,9,"B"]]
15
16# 範囲を複数指定することも可能
17nm.mcut(x=True,f="1-0,2-4",i=dat.csv).run()
18# [[1,"A",2,3,4],[9,"B",8,7,6]]
19
20# Lを付けることで後ろからの指定になる。2Lで後ろから、0から数えて2番目(f08)となる。
21nm.mcut(x=True,f="2L",i=dat.csv).run()
22# [[8],[2]]
23
24# "5-3L"の指定により、5番項目から後ろから3番目の項目、すなわち「5,6,7」を指定したことになる。
25nm.mcut(x=True,f="5-3L",i=dat.csv).run()
26# [[5,6,7],[5,4,3]]