File CSV adalah bahasa persekutuan antar aplikasi: hasil ekspor mesin kasir, laporan spreadsheet, dan unduhan data sistem besar sering tiba dalam format ini. Membacanya di Python memang mudah, tetapi data nyata hampir selalu menyimpan kejutan — tanggal yang tidak konsisten, angka yang rusak, kolom yang luput terisi. Pada proyek ini kita membangun pengolah file CSV: alat baris perintah yang membaca data penjualan, memvalidasi setiap baris, meringkasnya menjadi laporan, lalu menuliskan hasil olahan ke berkas keluaran.

Studi kasus kita adalah laporan penjualan harian sebuah kedai kopi. Satu baris merekam satu transaksi dengan lima kolom: tanggal, produk, kategori, jumlah, dan harga. Dari data sesederhana ini, alat yang kita bangun akan menjawab pertanyaan yang benar-benar dipakai pemilik usaha: berapa omzet hari itu, kategori mana yang menopang pendapatan, produk apa yang paling laris, dan baris mana yang tidak bisa dipercaya.

Perilaku yang Diharapkan #

Hasil akhir proyek adalah satu program main.py yang dipanggil dengan nama berkas CSV sebagai argumen. Contoh sesi pemakaian berikut menunjukkan perilaku akhir yang ingin kita capai:

bash
python3 main.py sample.csv

Output yang Dihasilkan:

text
Baris valid       : 9
Baris tidak valid : 4
Hasil ditulis ke  : ringkasan.csv, laporan.txt

Program menuliskan dua berkas keluaran. ringkasan.csv berisi agregasi per kategori dalam format yang bisa dibaca program lain, sedangkan laporan.txt adalah laporan siap baca untuk manusia:

text
LAPORAN PENJUALAN
=================
Total baris       : 13
Baris valid       : 9
Baris tidak valid : 4

Total omzet        : Rp311,000
Rata-rata transaksi: Rp34,555.56
Transaksi tertinggi: 2025-06-06 Kopi Hitam (Rp60,000)
Produk terlaris    : Es Teh Manis (8 item)

OMZET PER KATEGORI
------------------
Kategori     Transaksi  Jumlah       Omzet
Minuman              6      21     234,000
Makanan              2       3      49,000
Camilan              1       2      28,000

BARIS DILEWATI
--------------
- baris 5: tanggal tidak berformat YYYY-MM-DD
- baris 9: nilai jumlah harus lebih besar dari 0
- baris 11: kolom produk kosong
- baris 14: kolom harga kosong

Kontrak Data #

Module csv menyerahkan seluruh nilai sebagai string. Konversi ke tipe yang benar beserta pemeriksaannya menjadi tanggung jawab program kita, dan itulah inti proyek ini. Kontrak setiap kolom dirangkum pada tabel berikut:

KolomTipe akhirAturan
tanggalstr → datetimewajib terisi, format YYYY-MM-DD
produkstrwajib terisi
kategoristrwajib terisi
jumlahstr → intwajib terisi, angka bulat lebih besar dari 0
hargastr → intwajib terisi, angka bulat lebih besar dari 0

Baris yang melanggar salah satu aturan tidak membatalkan seluruh analisis. Program mencatat pelanggaran sebagai laporan galat dengan nomor baris fisik berkas, lalu melanjutkan analisis pada baris yang valid.

Prasyarat #

Sebelum mulai, pastikan materi berikut sudah dikuasai:

  • Membaca dan Menulis CSV — API dasar module csv di sisi baca dan tulis.
  • Membaca Data CSV — alur kerja DictReader pada data nyata.
  • f-strings — perataan kolom dan pemisah ribuan untuk keluaran tabel.
  • Dictionary — pola akumulasi untuk pengelompokan data.
  • Parsing dan Formatting datetime — validasi format tanggal dengan strptime.
  • Menulis Test dengan pytest — fixture, assertion, dan test berparameter untuk Bagian 4.

Tahapan Pengerjaan #

Proyek dikerjakan dalam empat bagian berurutan, dan setiap bagian menghasilkan program yang benar-benar berjalan:

  1. Bagian 1: Membaca Data CSV — membaca sample.csv dengan DictReader, mengonversi tipe, dan mencetak tabel omzet yang rapi.
  2. Bagian 2: Memvalidasi Data — memeriksa setiap baris terhadap kontrak data, mengumpulkan laporan galat, dan tetap memproses baris valid.
  3. Bagian 3: Mengolah dan Meringkas Data — agregasi omzet per kategori, produk terlaris, dan transaksi tertinggi dalam laporan terformat.
  4. Bagian 4: Menulis Hasil dan Testing — menuliskan ringkasan.csv dan laporan.txt, lalu menguji fungsi inti dengan pytest.

Kode sumber setiap tahap tersedia pada bagian Berkas Sumber di bawah masing-masing halaman bagian, sehingga kondisi program selalu bisa dicocokkan. Kerjakan berurutan dari Bagian 1 karena setiap bagian dibangun di atas berkas dan konsep bagian sebelumnya.