Previous: mchgstr 文字列の置換 Up: コマンドリファレンス Next: mcombi 組合せ計算 MCMD2
MCMD2 : コマンドリファレンス : mchkcsv CSVデータのチェック

3.10 mchkcsv CSVデータのチェック

MCMDが前提とするCSVの仕様を満たしていないデータを自動修復する(項目数の統一など)。 また、-diagオプションを指定することで、CSVデータのチェックのみ実行する。

書式

mchkcsv [a=] [-diag] [-r] [i=] [o=] [-assert_nullout] [-nfn] [-nfno] [-x] [-q] [tmpPath=] [--help] [--helpl] [--version]

パラメータ

i=

入力ファイル名

 

このパラメータで指定したCSVデータに不備な箇所がないかチェックを行い、

 

不備がある場合その箇所を自動的に補完する。

 

このパラメータが省略された時には標準入力が用いられる。

a=

入力データの項目名を無視し、ここで指定した項目名を出力する。

 

ここで指定した項目数が入力データの項目数より少ない場合は、

 

入力データの左から順番に指定の個数分の項目が出力される。

 

逆に、ここで指定した項目数が入力データの項目数より多い場合、不足分はNULL値が出力される。

-diag

チェックのみ実行する。

 

このオプションを指定した場合、結果は標準出力に出力される。

-r

制御文字を無視

 

ここではASCII文字コードの0x00〜0x1f,0x7f(0x09,0x0a,0x0dは除く)を制御文字と定義している。

 

このオプションを指定しなければ制御コードは自動的に&#xという文字列に変換される。

利用例

例1: データの補完

データの項目数が違う(2,4行目が3項目しかない)問題のあるデータを Mコマンドで利用できるデータに補完(4項目に自動的に補完)する。

$ more dat1.csv
商品,日付,数量,金額
A,20081201,1,10
A,20081202,2,
A,*,3
B,20081201,4,40
B,20081203,50
$ mchkcsv i=dat1.csv o=rsl1.csv
#END# kgchkcsv i=dat1.csv o=rsl1.csv
$ more rsl1.csv
商品,日付,数量,金額
A,20081201,1,10
A,20081202,2,
A,*,3,
B,20081201,4,40
B,20081203,50,

例2: データの補完、項目名変更

データの項目数が違う(3,5行目が3項目しかない)問題のあるデータを Mコマンドで利用できるデータに補完(4項目に自動的に補完)する。 その際に、入力データの左の項目から順番に「商品,日付,数量,金額」という項目名で出力する。

$ more dat2.csv
fld1,fld2,fld3,fld4
A,20081201,1,10
A,20081202,2,
A,*,3
B,20081201,4,40
B,20081203,50
$ mchkcsv a=商品,日付,数量,金額 i=dat2.csv o=rsl2.csv
#END# kgchkcsv a=商品,日付,数量,金額 i=dat2.csv o=rsl2.csv
$ more rsl2.csv
商品,日付,数量,金額
A,20081201,1,10
A,20081202,2,
A,*,3,
B,20081201,4,40
B,20081203,50,

例3: データの不備チェック、診断結果の出力

CSVデータに不備な箇所がないかチェックのみを行い、CSVファイル診断結果を出力する。

$ mchkcsv -diag i=dat1.csv o=rsl3.csv
#END# kgchkcsv -diag i=dat1.csv o=rsl3.csv
$ more rsl3.csv
#===================================================
# CSVファイル診断 
# file name : dat1.csv
#---------------------------------------------------
# 結果の一文字目の意味
# # : 情報行(問題なし)
# ? : KGMODにて扱えない問題点(?の後の文字は解説参照)
# よって、左端が全て#になればOK
#===================================================
############################ ヘッダー情報(1行目) ###
# 項目数 : 4
# 項目No.  項目名
# 1   商品
# 2   日付
# 3   数量
# 4   金額
#
############## EOL(End Of Line)情報(ヘッダー含む) ##
#         LF改行行数 : 6 (LineNo: 0 1 2 ... )
#
################# データ行情報(ヘッダー含まない) ###
#           総行数 : 5
#       総バイト数 : 66
#           平均長 : 13.2
#           最大長 : 16 (LineNo:2)
#           最小長 : 6 (LineNo:4)
# 注:長さは、改行文字も含めた長さ
#
################################# 項目数の一貫性 ###
?g 異なる項目数の行が発見されました。
?g  項目数:3 (LineNo:4)
?g  項目数:3 (LineNo:6)
#
####################################### 項目情報 ###
#  項目番号[1] 項目名[商品]
#    NULL値の行数                : 0 
#    DQUOTEで囲われていない行数  : 5 (LineNo: 1 2 3 ... )
#    DQUOTEで囲われている行数    : 0 
#
#  項目番号[2] 項目名[日付]
#    NULL値の行数                : 0 
#    DQUOTEで囲われていない行数  : 5 (LineNo: 1 2 3 ... )
#    DQUOTEで囲われている行数    : 0 
#
#  項目番号[3] 項目名[数量]
#    NULL値の行数                : 0 
#    DQUOTEで囲われていない行数  : 5 (LineNo: 1 2 3 ... )
#    DQUOTEで囲われている行数    : 0 
#
#  項目番号[4] 項目名[金額]
#    NULL値の行数                : 1 (LineNo: 2 )
#    DQUOTEで囲われていない行数  : 3 (LineNo: 1 2 4 )
#    DQUOTEで囲われている行数    : 0 
#
################################### 問題点の解説 ###
# ?a : 同じ項目名があると項目番号を特定できない。
#  【対処方法】kgchkcsv a=x,y,z のように項目名を新たに指定する。
# ?b : 項目名に不正な文字があるとエラーになる
#  【対処方法】kgchkcsv a=x,y,z のように項目名を新たに指定する。
# ?c : KGMODが扱う改行は高速化のためLF(UNIX改行)のみ。
#      この問題はRFC4180には準拠しておらずKGMOD独自の制約である。
#  【対処方法】kgchkcsv にて全てLFに変換される。
#
# ?d : 最終行にLFやCRなどの改行(EOL)文字が存在しない。
#      これはRFC4180にも準拠していない。
#  【対処方法】kgchkcsv にてLFが付加される。
#
# ?e : データファイル内に'\0'が入り込んでいる。
#      テキストファイルでない可能性が高い。
#      RFC4180には準拠していない。
#  【対処方法】kgchkcsv にて、"&#x00
#              kgchkcsv -rにて\0は削除される。
#
# ?f : KGMODが扱える一行の最大長を超過している。
#      現在の設定では1024000バイト以上の長さの行は扱えない。
#  【対処方法】環境変数を設定することで最大値を変更可能である。
#        ex) export KG_MaxRecLen=204800
#      ただし10240000バイトを越えては指定できない。 
#      この問題はRFC4180には準拠しておりKGMOD独自の制約である。
#
# ?g : KGMODでは全行同じ項目数を前提とする。
#      この問題はRFC4180には準拠しておりKGMOD独自の制約である。
#  【対処方法】
#       1) kgchkcsv  データHEADERの項目数に合わせる.
#            超過項目は捨てられ、足りない項目はnull値となる
#       2) kgchkcsv  a=x,y,z HEADER行をスキップし、
#            指定したx,y,zを項目名として1)と同様の処理を行う。
#
# ?h : 制御文字(0x01~0x1F,0x7F)が項目値として入り込んでいる。
#      テキストファイルでない可能性が高い。
#      RFC4180には準拠していない。
#  【対処方法】kgchkcsv にて、"&#x01
#              kgchkcsv -rにて制御文字は削除される。
#
# ?i : TABは利用できない。
#      RFC4180には準拠していない。
#  【対処方法】kgchksv にて、"&#x09
#              kgchkcsv -rにてTABは削除される。
#
# ?j : DQUOTEで囲われていない中でDQUOTEが見つかった
#        ex) NG: xxx,oo"oo,xxx  -> OK: xxx,"oo""oo",xxx
#      RFC4180には準拠していない。
#  【対処方法】kgchkcsv にて上記の変換を行う。
#
# ?k : DQUOTEで囲われている中で単一のDQUOTEが見つかった
#      ex) NG: xxx,"oo"oo",xxx  -> OK: xxx,"oo""oo",xxx
#      RFC4180には準拠していない。
#  【対処方法】kgchkcsvにて上記の変換を行う。
#-------------------------------------------------------------

関連コマンド

Previous: mchgstr 文字列の置換 Up: コマンドリファレンス Next: mcombi 組合せ計算 MCMD2