From 6629062da8141d29e069f94545b939d736bff894 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 18 Mar 2026 21:22:28 +0000 Subject: [PATCH 1/2] Add analyze_cars.py executable and cars.csv data file analyze_cars.py reads cars.csv and prints a report of car models grouped by country, showing make counts, body types, and individual models with year. https://claude.ai/code/session_019mr9epAsFwdRTEfjUG78Qi --- analyze_cars.py | 56 +++++++++++++++++++++++++++++++++++++++++++++ cars.csv | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100755 analyze_cars.py create mode 100644 cars.csv diff --git a/analyze_cars.py b/analyze_cars.py new file mode 100755 index 0000000..fd7e223 --- /dev/null +++ b/analyze_cars.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Analyze car models by country using cars.csv.""" + +import csv +import sys +from collections import defaultdict +from pathlib import Path + + +def load_cars(filepath: str) -> list[dict]: + with open(filepath, newline="", encoding="utf-8") as f: + return list(csv.DictReader(f)) + + +def analyze_by_country(cars: list[dict]) -> dict: + by_country = defaultdict(list) + for car in cars: + by_country[car["country"]].append(car) + return dict(by_country) + + +def print_report(by_country: dict) -> None: + total = sum(len(v) for v in by_country.values()) + print(f"Car Models by Country ({total} total)\n{'=' * 50}") + + for country in sorted(by_country): + models = by_country[country] + makes = sorted({c["make"] for c in models}) + types = defaultdict(int) + for car in models: + types[car["type"]] += 1 + + print(f"\n{country} — {len(models)} model(s), {len(makes)} make(s)") + print(f" Makes: {', '.join(makes)}") + print(f" Types: {', '.join(f'{t}:{n}' for t, n in sorted(types.items()))}") + print(f" Models:") + for car in sorted(models, key=lambda c: (c["make"], c["model"])): + print(f" {car['make']} {car['model']} ({car['year']}, {car['type']})") + + +def main() -> None: + csv_path = Path(__file__).parent / "cars.csv" + if len(sys.argv) > 1: + csv_path = Path(sys.argv[1]) + + if not csv_path.exists(): + print(f"Error: file not found: {csv_path}", file=sys.stderr) + sys.exit(1) + + cars = load_cars(csv_path) + by_country = analyze_by_country(cars) + print_report(by_country) + + +if __name__ == "__main__": + main() diff --git a/cars.csv b/cars.csv new file mode 100644 index 0000000..d27c7e0 --- /dev/null +++ b/cars.csv @@ -0,0 +1,60 @@ +make,model,country,year,type +Toyota,Camry,Japan,2023,Sedan +Toyota,Corolla,Japan,2023,Sedan +Toyota,RAV4,Japan,2023,SUV +Toyota,Prius,Japan,2023,Hybrid +Honda,Civic,Japan,2023,Sedan +Honda,Accord,Japan,2023,Sedan +Honda,CR-V,Japan,2022,SUV +Nissan,Altima,Japan,2023,Sedan +Nissan,Rogue,Japan,2023,SUV +Mazda,CX-5,Japan,2023,SUV +Ford,F-150,USA,2023,Truck +Ford,Mustang,USA,2023,Coupe +Ford,Explorer,USA,2023,SUV +Ford,Bronco,USA,2022,SUV +Chevrolet,Silverado,USA,2023,Truck +Chevrolet,Malibu,USA,2022,Sedan +Chevrolet,Equinox,USA,2023,SUV +Tesla,Model 3,USA,2023,Electric +Tesla,Model Y,USA,2023,Electric +Tesla,Model S,USA,2022,Electric +Jeep,Wrangler,USA,2023,SUV +Jeep,Cherokee,USA,2022,SUV +BMW,3 Series,Germany,2023,Sedan +BMW,5 Series,Germany,2023,Sedan +BMW,X5,Germany,2023,SUV +BMW,M3,Germany,2023,Sedan +Mercedes-Benz,C-Class,Germany,2023,Sedan +Mercedes-Benz,E-Class,Germany,2023,Sedan +Mercedes-Benz,GLE,Germany,2023,SUV +Audi,A4,Germany,2023,Sedan +Audi,Q5,Germany,2023,SUV +Audi,A6,Germany,2022,Sedan +Volkswagen,Golf,Germany,2023,Hatchback +Volkswagen,Passat,Germany,2022,Sedan +Volkswagen,Tiguan,Germany,2023,SUV +Porsche,911,Germany,2023,Coupe +Porsche,Cayenne,Germany,2023,SUV +Hyundai,Elantra,South Korea,2023,Sedan +Hyundai,Tucson,South Korea,2023,SUV +Hyundai,Santa Fe,South Korea,2023,SUV +Kia,Forte,South Korea,2023,Sedan +Kia,Sportage,South Korea,2023,SUV +Kia,Telluride,South Korea,2023,SUV +Genesis,G80,South Korea,2023,Sedan +Volvo,XC60,Sweden,2023,SUV +Volvo,XC90,Sweden,2023,SUV +Volvo,S60,Sweden,2022,Sedan +Ferrari,488,Italy,2022,Coupe +Ferrari,Roma,Italy,2023,Coupe +Lamborghini,Huracan,Italy,2022,Coupe +Alfa Romeo,Giulia,Italy,2023,Sedan +Fiat,500,Italy,2022,Hatchback +Peugeot,308,France,2023,Hatchback +Renault,Clio,France,2023,Hatchback +Citroën,C3,France,2022,Hatchback +Land Rover,Defender,UK,2023,SUV +Land Rover,Range Rover,UK,2023,SUV +Jaguar,F-Pace,UK,2023,SUV +Mini,Cooper,UK,2023,Hatchback From 2bd78d1983058f6f0de45c20fc9d7849d3ae0c39 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 18 Mar 2026 21:22:59 +0000 Subject: [PATCH 2/2] Replace Python script with FOCUS procedure for car analysis by country analyze_cars_by_country.fex uses the standard CAR demo file to report car models grouped and subtotaled by country of origin, sorted by country and make. https://claude.ai/code/session_019mr9epAsFwdRTEfjUG78Qi --- analyze_cars.py | 56 ---------------------------------- analyze_cars_by_country.fex | 20 +++++++++++++ cars.csv | 60 ------------------------------------- 3 files changed, 20 insertions(+), 116 deletions(-) delete mode 100755 analyze_cars.py create mode 100644 analyze_cars_by_country.fex delete mode 100644 cars.csv diff --git a/analyze_cars.py b/analyze_cars.py deleted file mode 100755 index fd7e223..0000000 --- a/analyze_cars.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -"""Analyze car models by country using cars.csv.""" - -import csv -import sys -from collections import defaultdict -from pathlib import Path - - -def load_cars(filepath: str) -> list[dict]: - with open(filepath, newline="", encoding="utf-8") as f: - return list(csv.DictReader(f)) - - -def analyze_by_country(cars: list[dict]) -> dict: - by_country = defaultdict(list) - for car in cars: - by_country[car["country"]].append(car) - return dict(by_country) - - -def print_report(by_country: dict) -> None: - total = sum(len(v) for v in by_country.values()) - print(f"Car Models by Country ({total} total)\n{'=' * 50}") - - for country in sorted(by_country): - models = by_country[country] - makes = sorted({c["make"] for c in models}) - types = defaultdict(int) - for car in models: - types[car["type"]] += 1 - - print(f"\n{country} — {len(models)} model(s), {len(makes)} make(s)") - print(f" Makes: {', '.join(makes)}") - print(f" Types: {', '.join(f'{t}:{n}' for t, n in sorted(types.items()))}") - print(f" Models:") - for car in sorted(models, key=lambda c: (c["make"], c["model"])): - print(f" {car['make']} {car['model']} ({car['year']}, {car['type']})") - - -def main() -> None: - csv_path = Path(__file__).parent / "cars.csv" - if len(sys.argv) > 1: - csv_path = Path(sys.argv[1]) - - if not csv_path.exists(): - print(f"Error: file not found: {csv_path}", file=sys.stderr) - sys.exit(1) - - cars = load_cars(csv_path) - by_country = analyze_by_country(cars) - print_report(by_country) - - -if __name__ == "__main__": - main() diff --git a/analyze_cars_by_country.fex b/analyze_cars_by_country.fex new file mode 100644 index 0000000..8d8eb9f --- /dev/null +++ b/analyze_cars_by_country.fex @@ -0,0 +1,20 @@ +-* analyze_cars_by_country.fex +-* Report: Car models by country of origin using the CAR demo file. +-* Shows count of models per country, with a breakdown by car model. + +TABLE FILE CAR + HEADING + "Car Models by Country of Origin" + " " + PRINT + MODEL/A20 AS 'Model' + BY + COUNTRY/A20 AS 'Country' + BY + CAR/A20 AS 'Make' + ON COUNTRY SUBHEAD + "Country: