깨진 주문 CSV 정제하기
목표
고객이 준 깨진 CSV 를 규칙대로 정제하고, 무엇을 왜 버렸는지 숫자로 설명할 수 있게 됩니다.
왜 중요한가
정제 스크립트에서 가장 위험한 것은 조용히 지우는 것입니다. 고객은 나중에 "왜 우리 매출이 이것밖에 안 되죠" 라고 묻고, 그때 버린 행의 수와 이유를 말할 수 없으면 그 프로젝트의 모든 숫자가 의심받습니다. 그래서 이 실습에는 버린 행을 세는 단계가 따로 있습니다.
또 하나. 정제 규칙은 엔지니어가 혼자 정하는 것이 아닙니다. "금액이 음수인 행은 환불로 보이는데 제외할까요, 따로 셀까요" 를 업무 담당자에게 물어야 합니다. 이 실습에서는 규칙을 미리 정해 주지만, 현장에서 그 규칙이 어디서 오는지는 기억해 두세요.
유효한 행의 조건 — 아래 셋을 모두 만족해야 합니다.
- 필드가 정확히 4개 (
id,customer,amount,date) customer가 비어 있지 않음amount가 0 이상의 정수 (음수, 빈 값, 숫자가 아닌 값은 전부 제외)
단계
/root/output을 만들고/opt/data/orders.csv를 정제한 결과를/root/output/clean.csv로 저장하세요.clean.csv의 첫 줄은 원본 헤더id,customer,amount,date그대로여야 합니다.- 유효한 행만 남겨
clean.csv가 헤더 포함 19줄이 되게 하세요. - 남은 행이 위 세 조건을 모두 만족하는지 확인하세요.
- 버린 행의 개수를
/root/output/bad_count.txt에 적으세요. - 정제 후 남은 행의 금액 합계를
/root/output/total.txt에 적으세요. - 금액 합계가 가장 큰 날짜를
/root/output/top_day.txt에YYYY-MM-DD형태로 적으세요. /root/output/by_day.csv를 만드세요. 첫 줄은date,total, 이후 날짜당 한 줄로 그날의 금액 합계를 적습니다.
참고
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 의 첫 줄은 원본 헤더 id,customer,amount,date 그대로여야 합니다.
원본의 첫 줄을 그대로 남겨야 합니다. 정제 대상은 데이터 행뿐입니다.
유효 행만 남기기
유효한 행만 남겨 clean.csv 가 헤더 포함 19줄이 되게 하세요.
규칙 세 가지를 모두 만족하는 행만 남깁니다. 헤더를 포함해 19줄이 되어야 합니다.
남은 행이 모두 규칙을 만족하는지 확인
남은 행이 위 세 조건을 모두 만족하는지 확인하세요.
필드 수, 빈 고객명, 음수·비숫자 금액 세 가지를 각각 확인하세요. 하나라도 남아 있으면 실패합니다.
버린 행 수 세기
버린 행의 개수를 /root/output/bad_count.txt 에 적으세요.
조용히 지우는 정제는 시한폭탄입니다. 원본 데이터 행 수에서 남은 행 수를 빼면 됩니다.
금액 합계 구하기
정제 후 남은 행의 금액 합계를 /root/output/total.txt 에 적으세요.
정제 후 남은 행의 금액만 더합니다. awk 의 필드 구분자 옵션을 쓰면 한 줄로 끝납니다.
최대 매출일 찾기
금액 합계가 가장 큰 날짜를 /root/output/top_day.txt 에 YYYY-MM-DD 형태로 적으세요.
건수가 아니라 금액 합계 기준입니다. 날짜별로 금액을 누적한 뒤 가장 큰 날을 고르세요.
일자별 집계표 만들기
/root/output/by_day.csv 를 만드세요. 첫 줄은 date,total, 이후 날짜당 한 줄로 그날의 금액 합계를 적습니다.
date,total 헤더로 시작하고 날짜당 한 줄입니다. 날짜순으로 정렬하면 읽기 좋습니다.