5.47. mselstr 文字列による行選択

f= で指定した項目の値が、 v= で指定した文字列に一致すれば、その行を選択する。 典型例を 表 5.6表 5.8 に示す。 表 5.7 では key に関係なく val"y" である行を選択する。 表 5.8 では、 val"x" の行を含んでいる同一キーの行全て、 すなわち key 項目が "a" である行全てを選択する。 すなわち key 項目が "b" の行はいずれも "x" を含んでいないので選択されない。

表 5.6 入力データ

key

val

a

x

a

y

b

y

b

z

表 5.7 f=val v=y

key

val

a

y

b

y

表 5.8 k=key f=val v=x

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 に示す。

表 5.9 入力データ

:math:` key `

:math:` fld1 `

:math:` fld2 `

k

\(v_{a1}\)

\(v_{a2}\)

k

\(v_{b1}\)

\(v_{b2}\)

表 5.10 表 5.9 で示されるデータに、mselstr k=key f=fld1,fld2 v=v1,v2を実行した時の、-R,-Fオプションの指定の有無によるマッチ条件の違い。条件にマッチすれば全行(2行)出力され、アンマッチなら1行も出力されない。

F オプション

R オプション

マッチ条件

(( \(v_{a1}\) == s1 or \(v_{a1}\) == s2) or ( \(v_{a2}\) == s1 or \(v_{a2}\) == s2)) or (( \(v_{b1}\) == s1 or \(v_{b1}\) == s2) or ( \(v_{b2}\) == s1 or \(v_{b2}\) == s2))

-F

(( \(v_{a1}\) == s1 or \(v_{a1}\) == s2) and ( \(v_{a2}\) == s1 or \(v_{a2}\) == s2)) or (( \(v_{b1}\) == s1 or \(v_{b1}\) == s2) and ( \(v_{b2}\) == s1 or \(v_{b2}\) == s2))

-R

(( \(v_{a1}\) == s1 or \(v_{a1}\) == s2) or ( \(v_{a2}\) == s1 or \(v_{a2}\) == s2)) and (( \(v_{b1}\) == s1 or \(v_{b1}\) == s2) or ( \(v_{b2}\) == s1 or \(v_{b2}\) == s2))

-F

-R

(( \(v_{a1}\) == s1 or \(v_{a1}\) == s2) and ( \(v_{a2}\) == s1 or \(v_{a2}\) == s2)) and (( \(v_{b1}\) == s1 or \(v_{b1}\) == s2) and ( \(v_{b2}\) == s1 or \(v_{b2}\) == s2))

パラメータ

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=)

バッファのサイズ数を指定する。

利用例

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)juicersl4.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

関連メソッド