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
という名前に変更されて出力される。
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項目が出力される。
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 に例を示す。
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 に例を示す。
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
に展開される。
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
を指定することで項目番号によって項目を指定している。
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
を指定して項目番号で項目を指定している。
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
では、項目名により項目を指定している。
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=
を指定すれば、入出力ともに項目ヘッダー付きのデータを扱うことになるが、項目指定のみ項目番号で行うことができるようになる。
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 にいくつかの例を示す。
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]]