再利用できる検証器を作る
目標
一度書いたら捨てるクレンジングスクリプトではなく、毎週届くファイルを自動で判定する検証ツールを作れるようになります。
なぜ重要なのか
検証ツールの本当の試験は、壊れたファイルではなく正常なファイルです。ルールが厳しすぎて、正常なファイルまで失敗させると、人は毎週「どうせまたあれだろう」と言って無視し始め、2か月後に本当の問題が来たときも同じように無視します。その時点では、検証ツールがあるほうが、ないよりも悪いです。あると信じさせておきながら、実際には何も防げないからです。
そのため、検証ツールは常に2つの方向で試験します。正常なファイルで合格するか、壊れたファイルで失敗するか。そして、結果は終了コードで伝えなければなりません。合格なら0、失敗なら0以外の値です。そうしてこそ、バッチパイプラインにそのまま組み込めます。
/opt/data/validate/にファイルが4つあります。3つはそれぞれ違う方法で壊れていて、1つは正常です。すべてのファイルのヘッダーはid,customer,amount,region,dateです。
3つのルール
- 形式: フィールドがちょうど5つで、
customerが空ではなく、amountが整数です - 重複:
idが一意である必要があります(同じidがもう一度出てきたら、その行が違反です) - 範囲:
amountが1以上10000000以下です
ステップ
/root/validateディレクトリを作成してください。bad_schema.csvの形式違反の行数を/root/validate/schema_bad.txtに書いてください。bad_dupe.csvで、重複として捨てるべき行数を/root/validate/dupe_rows.txtに書いてください。bad_range.csvの範囲違反の行数を/root/validate/range_bad.txtに書いてください。good.csvの違反の行数を/root/validate/good_bad.txtに書いてください。- 4つの値の合計を
/root/validate/total_bad.txtに書いてください。 /root/validate/validate.shを作成してください。最初の引数でCSVのパスを受け取り、違反が1つもなければ終了コード0、1つでもあれば0以外のコードで終わる必要があります。/root/validate/report.mdに、4つのファイルの名前とそれぞれの違反件数、そして合計を書いてください。
参考
- 重複idを探す:
cut -d, -f1 파일 | tail -n +2 | sort | uniq -d(プレースホルダーはファイル名です) - 終了コードの指定は
exit 0/exit 1、確認は実行の直後にecho $? - 採点では、
validate.shをgood.csvとbad_schema.csvのそれぞれに対して実行してみます。両方を正しく判定して初めて合格です。 - よくあるミス1: ステップ5で0以外の値が出ることです。過検知する検証ツールは、すぐに無視されます。
- よくあるミス2: ステップ7で画面にだけ結果を出力し、終了コードを変えないことです。機械が読む信号が先です。
作業ディレクトリを作る
/root/validateディレクトリを作成してください。
/root/validateの下に結果を集めます。
形式違反の行を数える
bad_schema.csvの形式違反の行数を/root/validate/schema_bad.txtに書いてください。
bad_schema.csvで、フィールド数、空の顧客名、非整数の金額の3つのうち1つでも違反している行の数です。
重複行を数える
bad_dupe.csvで、重複として捨てるべき行数を/root/validate/dupe_rows.txtに書いてください。
bad_dupe.csvで、同じidがもう一度出てきた行の数です。最初に出てきた行は数えません。
範囲違反の行を数える
bad_range.csvの範囲違反の行数を/root/validate/range_bad.txtに書いてください。
bad_range.csvで、amountが1以上10000000以下から外れた行です。0も違反です。
正常なファイルを確認する
good.csvの違反の行数を/root/validate/good_bad.txtに書いてください。
good.csvには違反がないはずです。ここで0が出なければ、検証ツールが過検知しています。
全体の違反の合計を出す
4つの値の合計を/root/validate/total_bad.txtに書いてください。
4つのファイルから出た数をすべて足します。
検証スクリプトを作る
/root/validate/validate.shを作成してください。最初の引数でCSVのパスを受け取り、違反が1つもなければ終了コード0、1つでもあれば0以外のコードで終わる必要があります。
ファイルのパスを引数で受け取り、合格なら終了コード0、違反があれば0以外の値で終わる必要があります。
検証レポートを書く
/root/validate/report.mdに、4つのファイルの名前とそれぞれの違反件数、そして合計を書いてください。
4つのファイル名とそれぞれの違反件数、そして合計が入っている必要があります。