.. _項目名ヘッダー: 項目名 ========================= mcmdはデータの列を名前(項目名)で扱うこともできるし、項目名なしのデータも扱うことができる。 本節では、データ上の項目名に関するルール、及びmcmdメソッドでの項目の指定方法について説明する。 利用可能文字 ------------------------------- 項目名として利用可能な文字は以下の通りである。 - マルチバイト文字 (UTF-8 など) - アルファベット (a-z,A-Z) - 数字 (0-9) - 半角記号 ただし、半角記号については、以下の 9 つの利用は避けることを推奨する。 利用してエラーとなるわけではないが、 いずれも mcmd の中で項目指定時の特殊文字として利用しており、 その特殊用途を利用できなくなる可能性があるからである。 - ``,`` カンマ - ``:`` コロン - ``%`` パーセント - ``*`` アスタリスク - ``?`` クエスチョンマーク - ``&`` アンド - ``\`` バックスラッシュ - ``]`` 四角括弧右 - ``[`` 四角括弧左 項目名ヘッダー上のソーティング情報 ----------------------------------- 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 を付加したり、 項目名に%が含まれているデータを扱うなどである。 入力項目と出力項目 -------------------------- 多くのコマンドで項目の指定には ``f=`` が利用される。 ``f=`` の書式は、「入力項目:出力項目」で、出力項目の指定を省略すれば、 入力項目名が出力項目名として利用される。 :numref:`field_ioname` では、 ``mcut`` により、 ``val`` 項目は ``frequency`` という名前に変更されて出力される。 .. code-block:: python :linenos: :caption: 入力と出力で項目名を変更する例 :name: field_ioname import nysol.mcmd as nm dat=[ ["key","val"], ["a",2], ["b",5], ["b",4] ] nm.mcut(f="key,val:frequency",i=dat,o="rsl.csv").run() # key,frequency # a,2 # b,9 :numref:`field_addname` では、 ``maccum`` が、 ``val`` 項目の累計を計算し、追加項目 ``accum`` として出力し、 ``key,val,accum`` の3項目が出力される。 .. code-block:: python :linenos: :caption: 入力と出力で項目名を変更する例 :name: field_addname nm.maccum(f="val:accum", i=dat.csv).run() # key,val,accum # a,2,2 # b,5,7 # b,4,11 ワイルドカード -------------------------- mcmdメソッドで、複数項目を指定する際には、項目名に ``*`` と ``?`` のワイルドカードを利用することができる。 ``*`` は任意の長さの任意の文字列にマッチし、 ``?`` は任意の1文字にマッチする。 また、ワイルドカードの評価順は入力データ上の項目の並び順となることに注意する。 例えば、入力データの項目の並びが、A5,A3,A4,A2,A1 であれば、 `f=A*` は `f=A5,A3,A4,A2,A1` と評価される。 :numref:`field_wildcard` に例を示す。 .. code-block:: python :linenos: :caption: ワイルドカードを用いた項目名指定 :name: field_wildcard import nysol.mcmd as nm dat=[ ["item","f09","f10","f11","f123"], ["A",1,2,3,4] ["B",3,2,1,0] ] # fで始まる項目名を指定 nm.mcut(f="f*", i=dat.csv,o=rsl.csv).run() # rsl.csvの内容 # f09,f10,f11,f123 # 1,2,3,4 # 3,2,1,0 # f1で始まり任意の1文字が続く項目名(f10,f11)を指定 nm.mcut(f="f1?", i=dat.csv, o="rsl.csv").run() # f10,f11 # 2,3 # 2,1 出力項目名の置換 -------------------------- 出力項目名に指定された ``&`` は特殊な意味を持ち、入力項目名に置換される。 例えば、 ``f=abc:xx&xx`` では、出力項目名は xxabcxx に置換される。 ``&`` は、出力項目名の任意の位置に指定することができ、またその指定数に制限はない。 :numref:`field_repout` に例を示す。 .. code-block:: python :linenos: :caption: 出力項目名の置換の例 :name: field_repout import nysol.mcmd as nm dat=[ ["item","f09","f10","f11","f123"], ["A",1,2,3,4] ["B",3,2,1,0] ] nm.mcut(f="item:&_code", i=dat.csv, o="rsl.csv") # rsl.csvの内容 # item_code,f09,f10,f11,f123 # A,1,2,3,4 # B,3,2,1,0 ワイルドカードの指定においても出力項目名の置換は可能である。 ワイルドカードを全て展開し、それらの項目全てに同じ置換のルールが適用される。 :numref:`field_repwild` では、ワイルドカード ``f*`` は ``f09,f10,f11,f123`` に展開され、 それぞれについて ``g_&`` の置換ルールが適用され ``g_f09,g_f10,g_f11,g_f123`` に展開される。 .. code-block:: python :linenos: :caption: 出力項目名の置換の例 :name: field_repwild import nysol.mcmd as nm dat=[ ["item","f09","f10","f11","f123"], ["A",1,2,3,4] ["B",3,2,1,0] ] nm.mcut(f="f*:g_&", i=dat.csv, o="rsl.csv") # rsl.csvの内容 # g_f09,g_f10,g_f11,g_f123 # 1,2,3,4 # 3,2,1,0 項目名ヘッダーなしでの利用 ------------------------------- mcmdは項目名以外にも、項目番号によって項目を指定することが可能である。 項目番号による扱いに関係するパラメータは ``nfn=`` , ``nfno=`` , ``nfni=`` , ``x=`` の4つある。 以下では、例を示しながら、その利用方法について説明する。 なお、項目番号は左から 0,1,2 のように 0 から始まることに注意する。 また、項目番号の指定は、整数ではなく文字列で与えなければならない。 nfn= '''''''''''''''''''' ``nfn=True`` (no field name) を指定すると、入力データの先頭行を項目名ヘッダーと見なさず、また項目名ヘッダーを出力もしない。 :numref:`field_ex1` では、 項目名ヘッダーのないデータ ``dat`` について、 ``msum`` では ``nfn=True`` を指定することで項目番号によって項目を指定している。 .. code-block:: python :linenos: :caption: ``nfn=True`` で項目番号で項目を指定する例 :name: field_ex1 import nysol.mcmd as nm dat=[ ["a",2], ["b",5], ["b",4] ] nm.msum(nfn=True,k="0",f="1",i=dat).run() # a,2 # b,9 nfno= '''''''''''''''''''' ``nfno=`` (no field name for output) を指定すると,入力データの先頭行は項目名行として扱うが、 出力データには項目名を出力しない。 :numref:`field_ex2` では、 ``msum`` の結果には項目名ヘッダーが出力されていないので、 続く ``mcut`` では ``nfn=True`` を指定して項目番号で項目を指定している。 .. code-block:: python :linenos: :caption: ``nfno=True`` で項目番号で項目を指定する例 :name: field_ex2 import nysol.mcmd as nm dat=[ ["key","val"], ["a",2], ["b",5], ["b",4] ] nm.msum(nfno=True,k="key",f="val",i=dat).mcut(nfn=True,f="0,1").run() # a,2 # b,9 nfni= '''''''''''''''''''' ``nfni=`` (no field name for input) は ``mcut`` でのみ指定可能なオプションである。 このオプションは ``nfno=`` と逆の働きをする。 すなわち,入力データの先頭行は項目名行として扱わないが,出力データには項目名を出力する。 出力データの項目名は ``f=`` で項目番号に続けて ``:`` で区切って指定する。 :numref:`field_ex3` の例では、 ``mcut`` により、0番目1番目の項目に ``key``, ``val`` という項目名を付け、 続く ``msum`` では、項目名により項目を指定している。 .. code-block:: python :linenos: :caption: ``nfni=True`` で項目番号で項目を指定する例 :name: field_ex3 import nysol.mcmd as nm dat=[ ["a",2], ["b",5], ["b",4] ] nm.mcut(nfni=True,f="0:key,1:val",i=dat).msum(k="key",f="val").run() # a,2 # b,9 -x '''''''''''''''''''' 項目名行があるデータに対して、項目番号で指定したい場合は ``x=`` オプションを利用する。 :numref:`field_ex4` の例では、 入力データは項目ヘッダーがあるが、 ``msum`` では項目番号により項目を指定し、 続く ``mcut`` では項目名により項目を指定している。 このように ``x=`` を指定すれば、入出力ともに項目ヘッダー付きのデータを扱うことになるが、項目指定のみ項目番号で行うことができるようになる。 .. code-block:: python :linenos: :caption: ``x=True`` で項目番号で項目を指定する例 :name: field_ex4 import nysol.mcmd as nm dat=[ ["key","val"], ["a",2], ["b",5], ["b",4] ] nm.msum(x=True,k="0",f="1",i=dat).mcut(f="key,val").run() # a,2 # b,9 多様な項目番号の指定方法 ''''''''''''''''''''''''''' 項目番号の指定では、単純に項目番号をカンマで区切って列挙する以外にも、 後ろの項目からの番号指定 ("L"を付 ける) や範囲 (-) を指定することが可能である。 例えば 0L とすれば、最後の項目を指定したことになり、2L とすれば、 最後から数えて2番目の項目 (0 番から始まることに注意) を指定したことになる。 また 0-5 と指定すれば、0 番項目 から 5 番項目まで 6 つの項目を指定したことになる。 すなわち 0,1,2,3,4,5 と指定したことと同等である。 :numref:`field_num` にいくつかの例を示す。 .. code-block:: python :linenos: :caption: 項目番号を範囲や末尾から指定する例 :name: field_num import nysol.mcmd as nm dat=[ ["item","f01","f02","f03","f04","f05","f06","f07","f08","f09","f10"], ["A",1,2,3,4,5,6,7,8,9,10] ["B",9,8,7,6,5,4,3,2,1,0] ] # 0-4で0,1,2,3,4を指定したことになる nm.mcut(x=True,f="0-4",i=dat.csv).run() # [["A",1,2,3,4],["B",9,8,7,6]] # 4-0で4,3,2,1を指定したことになる nm.mcut(x=True,f="4-0",i=dat.csv).run() # [[4,3,2,1,"A"],[6,7,8,9,"B"]] # 範囲を複数指定することも可能 nm.mcut(x=True,f="1-0,2-4",i=dat.csv).run() # [[1,"A",2,3,4],[9,"B",8,7,6]] # Lを付けることで後ろからの指定になる。2Lで後ろから、0から数えて2番目(f08)となる。 nm.mcut(x=True,f="2L",i=dat.csv).run() # [[8],[2]] # "5-3L"の指定により、5番項目から後ろから3番目の項目、すなわち「5,6,7」を指定したことになる。 nm.mcut(x=True,f="5-3L",i=dat.csv).run() # [[5,6,7],[5,4,3]]