5.47. mselstr 文字列による行選択¶
f=
で指定した項目の値が、 v=
で指定した文字列に一致すれば、その行を選択する。
典型例を 表 5.6 〜 表 5.8 に示す。
表 5.7 では key
に関係なく val
が "y"
である行を選択する。
表 5.8 では、 val
が "x"
の行を含んでいる同一キーの行全て、
すなわち key
項目が "a"
である行全てを選択する。
すなわち key
項目が "b"
の行はいずれも "x"
を含んでいないので選択されない。
key |
val |
---|---|
a |
x |
a |
y |
b |
y |
b |
z |
key |
val |
---|---|
a |
y |
b |
y |
key |
val |
---|---|
a |
x |
a |
y |
また、以下に示すように多様な選択条件を指定することも可能である。 このコマンドで指定できない複雑な条件(例えば正規表現など)を設定するのであれば msel 条件式による行選択 コマンドを利用すればよい。
v=
に複数の文字列を指定すれば、いずれかの文字列にマッチすれば選択される。
f=
に複数項目を指定すれば、いずれかの項目の値がマッチすれば選択される。複数項目のマッチ条件をAND条件とすることも可能(
F
オプション)。完全一致だけでなく、先頭一致、末尾一致、部分一致の指定も可能(
head
,tail
sub
オプション)。
k=
を指定することでキー単位で選択することが可能。キー単位選択の場合、複数レコードのAND条件を指定可能(
R
オプション)。
いま同じキーのデータとして2項目2行からなるデータ( 表 5.9 )に対して、
mselstr k=key f=fld1,fld2 v=s1,s2
を実行した場合、
オプション R
, F
の指定の有無によるマッチ条件を 表 5.10 に示す。
:math:` |
:math:` |
:math:` |
---|---|---|
k |
\(v_{a1}\) |
\(v_{a2}\) |
k |
\(v_{b1}\) |
\(v_{b2}\) |
|
|
マッチ条件 |
---|---|---|
(( \(v_{a1}\) |
||
-F |
(( \(v_{a1}\) |
|
-R |
(( \(v_{a1}\) |
|
-F |
-R |
(( \(v_{a1}\) |
パラメータ¶
i= : 型=str , 任意(default=標準入力)
入力データを指定する。
f= : 型=str , 必須
検索対象となる項目名リスト(複数項目指定可)を指定する。
v= : 型=str , 必須
f=
パラメータで指定した項目の値が、ここで指定した文字列リスト(複数項目指定可)の1つにマッチすれば選択される。
k= : 型=str , 任意(default=キーブレイク処理しない)
選択する単位となるキー項目(複数項目指定可)を指定する。
o= : 型=str , 任意(default=標準出力)
指定の条件に一致する行を出力するデータを指定する。
u= : 型=str , 任意(default=出力しない)
指定の条件に一致しない行を出力するデータを指定する。
F= : 型=bool , 任意(default=False)
f=
パラメータで複数項目を指定した場合、その全ての値がマッチする行を撰択する。
r= : 型=bool , 任意(default=False)
条件反転選択ではなく削除する。
R= : 型=bool , 任意(default=False)
k=
パラメータを指定した場合、その全ての行がマッチすれば行を撰択する。
sub= : 型=bool , 任意(default=False)
検索を完全一致ではなく部分文字列マッチで比較する。すなわち、f=
パラメータで指定した項目の値に、v=
パラメータで指定の文字列が部分文字列として含まれていればその行を撰択する。
head= : 型=bool , 任意(default=False)
先頭文字列マッチオプション
tail= : 型=bool , 任意(default=False)
末尾文字列マッチオプション
W= : 型=bool , 任意(default=False)
sub
,head
,tail
オプションが指定されているときにワイド文字として部分文字列マッチをおこなう。
bufcount= : 型=str , 任意(default=)
バッファのサイズ数を指定する。
共通パラメータ¶
i= , o= , bufcount= , assert_diffSize= , assert_nullkey= , assert_nullin= , nfn= , nfno= , x= , q= , tmppath= , precision=
利用例¶
importと入力データ(CSV)の準備
1import nysol.mcmd as nm 2 3with open('dat1.csv','w') as f: 4 f.write( 5'''item,amount 6apple,100 7milk,350 8orange,100 9pineapplejuice,500 10wine,1000 11''') 12 13with open('dat2.csv','w') as f: 14 f.write( 15'''customer,item,amount 16A,apple,100 17A,milk,350 18B,orange,100 19B,orange,100 20B,pineapple,500 21B,wine,1000 22C,apple,100 23C,orange,100 24''') 25 26with open('dat3.csv','w') as f: 27 f.write( 28'''item,amount 29果物:柿,100 30果物:桃,250 31果物:葡萄,300 32果物:梨,450 33果物:苺,500 34''') 35 36with open('dat4.csv','w') as f: 37 f.write( 38'''customer,item,amount,gender,buyDate,prevBuyDate 39A,apple,100,1,2013/01/04,2013/01/01 40A,milk,350,1,2013/04/04,2011/05/06 41B,orange,100,2,2012/11/11,2011/12/12 42B,orange,100,2,2013/05/30,2012/11/11 43B,pineapple,500,2,2013/04/15,2013/04/01 44B,wine,1000,2,2012/12/24,2011/12/24 45C,apple,100,2,2013/02/14,NULL 46C,orange,100,2,2013/02/14,2013/01/31 47D,orange,100,2,2011/10/28,NULL 48''')
基本例
item
項目の値が apple、orange
に完全一致する行を選択し、
rsl1.csv
に出力する。
u=oth1.csv
を指定すれば、それ以外の行は oth1.csv
に出力する。
pineapplejuice
は完全一致ではないので、 oth1.csv
に出力される。
1nm.mselstr(f="item", v="apple,orange", u="oth1.csv", i="dat1.csv", o="rsl1.csv").run() 2### oth1.csv の内容 3# item,amount 4# milk,350 5# pineapplejuice,500 6# wine,1000 7### rsl1.csv の内容 8# item,amount 9# apple,100 10# orange,100
行の削除
r=True
オプションを指定することで、例1とは逆に、商品項目の値が apple、orange
に完全一致する行を削除し、
rsl2.csv
に出力する。
1nm.mselstr(f="item", v="apple,orange", r=True, i="dat1.csv", o="rsl2.csv").run() 2### rsl2.csv の内容 3# item,amount 4# milk,350 5# pineapplejuice,500 6# wine,1000
キー単位での選択
orange
を購入したことのある顧客を選択する
k=顧客
を指定することで、 orange
を購入したことのある顧客の他に購入した商品の行を含めて選択する。
それ以外の行は oth2.csv
に出力する。
1nm.mselstr(k="customer", f="item", v="orange", u="oth2.csv", i="dat2.csv", o="rsl3.csv").run() 2### oth2.csv の内容 3# customer%0,item,amount 4# A,apple,100 5# A,milk,350 6### rsl3.csv の内容 7# customer%0,item,amount 8# B,orange,100 9# B,orange,100 10# B,pineapple,500 11# B,wine,1000 12# C,apple,100 13# C,orange,100
部分一致
item
項目の値が apple
に部分一致するの行を選択し、
rsl4.csv
に出力する。
部分一致であるため pine(apple)juice
も rsl4.csv
に出力される。
1nm.mselstr(f="item", v="apple", sub=True, i="dat1.csv", o="rsl4.csv").run() 2### rsl4.csv の内容 3# item,amount 4# apple,100 5# pineapplejuice,500
ワイド文字の部分一致
item
項目の値がワイド文字の「柿」、「桃」、「葡萄」の行を選択(部分一致)
選択項目にワイド文字が使用されている場合にバイト単位のマッチングを使用すると、
マルチバイト文字をまたいだ文字列にマッチングする可能性がある。
その為、ワイド文字が選択項目に含まれる場合は W=True
オプションを使用して、
ワイド文字を使用していることを意図的に示す必要がある。
1nm.mselstr(f="item", v="柿,桃,葡萄", sub=True, W=True, i="dat3.csv", o="rsl5.csv").run() 2### rsl5.csv の内容 3# item,amount 4# 果物:柿,100 5# 果物:桃,250 6# 果物:葡萄,300
商品の購入日と前回の購入日が2013年の商品データを選択
F=True
オプションを指定することで、同じ商品を2013年内に購入したことのある(購入日と前回購入日両方が2013年)商品行を選択し、
rsl6.csv
に出力する。
それ以外の行は oth3.csv
に出力する。
1nm.mselstr(f="buyDate,prevBuyDate", F=True, sub=True, v="2013", u="oth3.csv", i="dat4.csv", o="rsl6.csv").run() 2### oth3.csv の内容 3# customer,item,amount,gender,buyDate,prevBuyDate 4# A,milk,350,1,2013/04/04,2011/05/06 5# B,orange,100,2,2012/11/11,2011/12/12 6# B,orange,100,2,2013/05/30,2012/11/11 7# B,wine,1000,2,2012/12/24,2011/12/24 8# C,apple,100,2,2013/02/14,NULL 9# D,orange,100,2,2011/10/28,NULL 10### rsl6.csv の内容 11# customer,item,amount,gender,buyDate,prevBuyDate 12# A,apple,100,1,2013/01/04,2013/01/01 13# B,pineapple,500,2,2013/04/15,2013/04/01 14# C,orange,100,2,2013/02/14,2013/01/31
商品の購入日と前回の購入日が2013年の顧客データの抽出
k=顧客
を指定することで、同じ商品を2013年内に購入したことのある顧客の他に購入した商品の行を含めて選択する。
それ以外の行は oth4.csv
に出力する。
1nm.mselstr(k="customer", f="buyDate,prevBuyDate", F=True, sub=True, v="2013", u="oth4.csv", i="dat4.csv", o="rsl7.csv").run() 2### oth4.csv の内容 3# customer%0,item,amount,gender,buyDate,prevBuyDate 4# D,orange,100,2,2011/10/28,NULL 5### rsl7.csv の内容 6# customer%0,item,amount,gender,buyDate,prevBuyDate 7# A,apple,100,1,2013/01/04,2013/01/01 8# A,milk,350,1,2013/04/04,2011/05/06 9# B,orange,100,2,2012/11/11,2011/12/12 10# B,orange,100,2,2013/05/30,2012/11/11 11# B,pineapple,500,2,2013/04/15,2013/04/01 12# B,wine,1000,2,2012/12/24,2011/12/24 13# C,apple,100,2,2013/02/14,NULL 14# C,orange,100,2,2013/02/14,2013/01/31
2013年度の新規顧客情報の抽出
R=True
オプションを指定することで、購入日、前回購入日両方が2013年,NULL(前回購入なし)の顧客情報を抽出する。
つまり2013年の新規顧客データを選択し、 rsl8.csv
に出力する。
それ以外の行は oth5.csv
に出力する。
1nm.mselstr(k="customer", f="buyDate,prevBuyDate", F=True, R=True, sub=True, v="2013,NULL", u="oth5.csv", i="dat4.csv", o="rsl8.csv").run() 2### oth5.csv の内容 3# customer%0,item,amount,gender,buyDate,prevBuyDate 4# A,apple,100,1,2013/01/04,2013/01/01 5# A,milk,350,1,2013/04/04,2011/05/06 6# B,orange,100,2,2012/11/11,2011/12/12 7# B,orange,100,2,2013/05/30,2012/11/11 8# B,pineapple,500,2,2013/04/15,2013/04/01 9# B,wine,1000,2,2012/12/24,2011/12/24 10# D,orange,100,2,2011/10/28,NULL 11### rsl8.csv の内容 12# customer%0,item,amount,gender,buyDate,prevBuyDate 13# C,apple,100,2,2013/02/14,NULL 14# C,orange,100,2,2013/02/14,2013/01/31
関連メソッド¶
msel 条件式による行選択 : より複雑な条件で行選択を行う。
mcommon 参照ファイルによる行選択 : 選択対象となる文字列の数が多いときは、参照データを用意することで
mcommon
コマンドが使える。