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という文字列に変換される。 |
データの項目数が違う(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,
データの項目数が違う(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,
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 にて、"� # 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 にて、" # kgchkcsv -rにて制御文字は削除される。 # # ?i : TABは利用できない。 # RFC4180には準拠していない。 # 【対処方法】kgchksv にて、"	 # 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にて上記の変換を行う。 #-------------------------------------------------------------