"""Read a sample CSV without modifying it; Python 3.9+.""" import csv import re import sys def check(path): seen = set() total = accepted = excluded = count = 0 with open(path, encoding="utf-8-sig", newline="") as stream: reader = csv.DictReader(stream) expected = ["id", "item", "quantity", "unit_price_jpy", "status"] if reader.fieldnames != expected: raise ValueError("列名または列順が違います") for line, row in enumerate(reader, start=2): if None in row or any(value is None for value in row.values()): raise ValueError(f"{line}行目: 列の数が違います") if not row["id"] or row["id"] in seen: raise ValueError(f"{line}行目: IDが空か重複しています") seen.add(row["id"]) if not re.fullmatch(r"[1-9][0-9]{0,5}", row["quantity"]): raise ValueError(f"{line}行目: 数量は1〜999999の整数です") if not re.fullmatch(r"[0-9]{1,9}", row["unit_price_jpy"]): raise ValueError(f"{line}行目: 単価は桁区切りなしの0以上の整数です") if row["status"] not in {"paid", "cancelled"}: raise ValueError(f"{line}行目: 状態が不明です") count += 1 if row["status"] == "paid": total += int(row["quantity"]) * int(row["unit_price_jpy"]) accepted += 1 else: excluded += 1 return f"行数={count} / 対象={accepted} / 除外={excluded} / 合計={total}円" if __name__ == "__main__": try: if len(sys.argv) != 2: raise ValueError("使い方: python3 check_orders.py orders.csv") print(check(sys.argv[1])) except (ValueError, OSError, UnicodeError, csv.Error) as error: print(f"確認中止: {error}", file=sys.stderr) sys.exit(1)