きっかけは「CSVを整えるだけ」
CSVを読み込んで、
少し加工して出力する。
それだけの作業でした。
手作業だとミスが出やすいので、
「これは自動化できそうだ」
と思ったのが始まりです。
最初に書いたコード
最初は、処理の流れをそのまま
1つの関数に書きました。
def process_csv(file):
rows = read_csv(file)
result = []
for row in rows:
if row["status"] == "active":
row["price"] = int(row["price"]) * 1.1
result.append(row)
write_csv(result)
この時点では、
- 条件も
- 加工も
- 出力も
全部まとめて書いています。
すぐに困ったこと
しばらくすると、
要件が少し変わりました。
- 条件が1つ増える
- 別のCSVにも使いたい
- 加工ロジックを切り替えたい
すると、
この関数は一気に触りにくくなりました。
「直せるけど、毎回怖い」
という状態です。
失敗の原因
振り返ると、
失敗の原因ははっきりしていました。
- 条件
- 加工
- 出力
を分けて考えていなかったことです。
「CSV処理」という言葉で、
全部を一つにまとめてしまっていました。
設計を変えた後
そこで、役割ごとに処理を分けました。
def filter_active(rows):
return [r for r in rows if r["status"] == "active"]
def apply_price_change(rows):
for r in rows:
r["price"] = int(r["price"]) * 1.1
return rows
処理を分けただけですが、
- 条件変更が楽になる
- テストしやすくなる
- 他のCSVにも流用できる
ようになりました。
作って分かったこと
このCSV自動化で分かったのは、
- CSV処理は意外とすぐ変わる
- 最初の「まとめ書き」は後で効いてくる
- 分けておくと判断が楽
ということです。
完成形よりも、
「どこで失敗したか」を覚えておく方が、
次に活きると感じました。
おわりに
この話は、
CSV自動化を作ってみて
最初に設計でつまずいた経験を
そのまま残した実践ログです。


コメント