壊れた注文CSVを整形する
目標
顧客が渡した壊れたCSVをルールどおりにクレンジングし、何をなぜ捨てたのかを数字で説明できるようになります。
なぜ重要なのか
クレンジングスクリプトで最も危険なのは、静かに消すことです。顧客はあとで「なぜうちの売上はこれしかないのですか」と尋ね、そのとき捨てた行の数と理由を答えられなければ、そのプロジェクトのすべての数字が疑われます。そのため、このラボには、捨てた行を数えるステップが別にあります。
もう1つ。クレンジングのルールは、エンジニアが1人で決めるものではありません。「金額が負の行は返金に見えますが、除外しますか、別に数えますか」を、業務担当者に尋ねなければなりません。このラボではルールを先に決めて渡しますが、現場でそのルールがどこから来るのかを覚えておいてください。
有効な行の条件: 次の3つをすべて満たす必要があります。
- フィールドがちょうど4つです(
id,customer,amount,date) customerが空ではありませんamountが0以上の整数です(負の値、空の値、数字でない値はすべて除外)
ステップ
/root/outputを作成し、/opt/data/orders.csvをクレンジングした結果を/root/output/clean.csvとして保存してください。clean.csvの1行目は、原本のヘッダーid,customer,amount,dateのままにしてください。- 有効な行だけを残して、
clean.csvがヘッダーを含めて19行になるようにしてください。 - 残った行が上の3つの条件をすべて満たすことを確認してください。
- 捨てた行の数を
/root/output/bad_count.txtに書いてください。 - クレンジング後に残った行の金額の合計を
/root/output/total.txtに書いてください。 - 金額の合計が最も大きい日付を
/root/output/top_day.txtにYYYY-MM-DDの形で書いてください。 /root/output/by_day.csvを作成してください。1行目はdate,totalで、以降は日付ごとに1行で、その日の金額の合計を書きます。
参考
awk -F, 'NR>1 && NF==4 && $2!="" && $3 ~ /^[0-9]+$/' 원본(プレースホルダーは原本ファイルです)- 合計は
awk -F, 'NR>1{s+=$3} END{print s}'、日付別の累計はawk -F, 'NR>1{s[$4]+=$3} END{for(d in s) print d","s[d]}' | sort - よくあるミス1: ステップ7で件数が最も多い日を選ぶことです。金額の合計が基準です。
- よくあるミス2: 原本
/opt/data/orders.csvを直接編集することです。顧客のデータは読み取りだけを行います。
クレンジング結果のファイルを作る
/root/outputを作成し、/opt/data/orders.csvをクレンジングした結果を/root/output/clean.csvとして保存してください。
/root/outputディレクトリを作成し、その中にclean.csvを作成してください。原本は/opt/data/orders.csvです。
ヘッダーを残す
clean.csvの1行目は、原本のヘッダーid,customer,amount,dateのままにしてください。
原本の1行目をそのまま残す必要があります。クレンジングの対象はデータ行だけです。
有効な行だけを残す
有効な行だけを残して、clean.csvがヘッダーを含めて19行になるようにしてください。
3つのルールをすべて満たす行だけを残します。ヘッダーを含めて19行になる必要があります。
残った行がすべてルールを満たすか確認する
残った行が上の3つの条件をすべて満たすことを確認してください。
フィールド数、空の顧客名、負または数字でない金額の3つを、それぞれ確認してください。1つでも残っていれば失敗です。
捨てた行を数える
捨てた行の数を/root/output/bad_count.txtに書いてください。
静かに消すクレンジングは時限爆弾です。原本のデータ行数から、残った行数を引けば求まります。
金額の合計を求める
クレンジング後に残った行の金額の合計を/root/output/total.txtに書いてください。
クレンジング後に残った行の金額だけを足します。awkのフィールド区切りのオプションを使えば、1行で済みます。
売上が最大の日を探す
金額の合計が最も大きい日付を/root/output/top_day.txtにYYYY-MM-DDの形で書いてください。
件数ではなく金額の合計が基準です。日付ごとに金額を累計してから、最も大きい日を選んでください。
日付別の集計表を作る
/root/output/by_day.csvを作成してください。1行目はdate,totalで、以降は日付ごとに1行で、その日の金額の合計を書きます。
date,totalのヘッダーで始まり、日付ごとに1行です。日付順に並べると読みやすくなります。