package main

import (
	"bytes"
	"encoding/csv"
	"fmt"
	"strings"
)

func main() {
	// Data Indonesia: angka desimal memakai koma, jadi pemisah kolom
	// diganti titik koma agar tidak bentrok.
	tabelTitikKoma := "nama;harga\nBuku Go;95.000,50\nKopi;12.500,00\n"
	r := csv.NewReader(strings.NewReader(tabelTitikKoma))
	r.Comma = ';'
	rekam, err := r.ReadAll()
	if err != nil {
		fmt.Println("baca gagal:", err)
		return
	}
	for _, baris := range rekam {
		fmt.Printf("titik koma: %q\n", baris)
	}

	// TSV: nilai dipisah tab.
	tsv := "nama\tkota\nBudi\tBandung\nSiti\tSurabaya\n"
	rTab := csv.NewReader(strings.NewReader(tsv))
	rTab.Comma = '\t'
	rekamTab, err := rTab.ReadAll()
	if err != nil {
		fmt.Println("baca gagal:", err)
		return
	}
	for _, baris := range rekamTab {
		fmt.Printf("tab: %q\n", baris)
	}

	// Baris dengan jumlah kolom berbeda: FieldsPerRecord = -1 melonggarkan
	// aturan jumlah kolom.
	beragam := "a,b\n1,2,3\nx\n"
	rAneh := csv.NewReader(strings.NewReader(beragam))
	rAneh.FieldsPerRecord = -1
	rekamAneh, err := rAneh.ReadAll()
	if err != nil {
		fmt.Println("baca gagal:", err)
		return
	}
	for _, baris := range rekamAneh {
		fmt.Printf("beragam: %q\n", baris)
	}

	// LazyQuotes: tanda kutip di tengah field tidak dianggap galat sintaks.
	kutip := `Budi "Si Cepat",Bandung`
	rLazy := csv.NewReader(strings.NewReader(kutip))
	rLazy.LazyQuotes = true
	rekamLazy, err := rLazy.Read()
	if err != nil {
		fmt.Println("baca gagal:", err)
		return
	}
	fmt.Printf("lazy: %q\n", rekamLazy)

	// Writer dengan Comma titik koma dan CRLF ala RFC 4180.
	var buf bytes.Buffer
	w := csv.NewWriter(&buf)
	w.Comma = ';'
	w.UseCRLF = true
	if err := w.Write([]string{"harga", "total"}); err != nil {
		fmt.Println("tulis gagal:", err)
		return
	}
	if err := w.Write([]string{"12.500,50", "25.001,00"}); err != nil {
		fmt.Println("tulis gagal:", err)
		return
	}
	w.Flush()
	if err := w.Error(); err != nil {
		fmt.Println("flush gagal:", err)
		return
	}
	fmt.Printf("tulis kustom: %q\n", buf.String())
}
