CSV (Comma-Separated Values) adalah format pertukaran data paling lama yang masih dipakai spreadsheet dan sistem ekspor hingga kini. .NET tidak menyertakan serializer CSV bawaan, sehingga kita menulis pemrosesan sendiri untuk kebutuhan sederhana. Aturan formatnya terlihat mudah, tetapi menyimpan satu jebakan klasik: koma boleh berada di dalam kolom yang dikutip, seperti "Kopi Gayo, Arabika". Parser yang mengabaikan aturan kutip akan memecah kolom tersebut menjadi dua nilai yang salah.
Jebakan string.Split #
Method baris.Split(',') memotong pada setiap koma tanpa memahami tanda kutip, sehingga satu kolom terpecah menjadi dua. Parser berikut memperbaikinya dengan penanda status (state) dalamKutip:
private static List<string> ParseBarisCsv(string baris)
{
var kolom = new List<string>();
var nilai = new StringBuilder();
bool dalamKutip = false;
for (int i = 0; i < baris.Length; i++)
{
char c = baris[i];
if (c == '"')
{
dalamKutip = !dalamKutip;
}
else if (c == ',' && !dalamKutip)
{
kolom.Add(nilai.ToString());
nilai.Clear();
}
else
{
nilai.Append(c);
}
}
kolom.Add(nilai.ToString());
return kolom;
}Membandingkan Kedua Cara #
string baris = "\"BRG-01\",\"Kopi Gayo, Arabika\",45000";
Console.WriteLine($"string.Split(',') -> {baris.Split(',').Length} kolom");
List<string> kolom = ParseBarisCsv(baris);
Console.WriteLine($"parser manual -> {kolom.Count} kolom");
foreach (string k in kolom)
{
Console.WriteLine($" [{k}]");
}Output yang Dihasilkan:
string.Split(',') -> 4 kolom
parser manual -> 3 kolom
[BRG-01]
[Kopi Gayo, Arabika]
[45000]Mari kita bedah parser manualnya:
dalamKutip = !dalamKutip: setiap karakter"membalik status; di dalam kutip, koma diperlakukan sebagai isi kolom biasa.c == ',' && !dalamKutip: pemisahan kolom hanya terjadi pada koma di luar kutip, sehingga kolom kedua tetap utuh.kolom.Add(nilai.ToString())di akhir loop: kolom terakhir tidak pernah disentuh koma, jadi harus ditambahkan setelah loop selesai.
Parser ini bekerja pada satu baris; untuk berkas utuh, baca teks dengan File.ReadAllLines lalu panggil method tersebut per baris. Ingat pula bahwa angka hasil parsing CSV masih berupa teks, sehingga konversi int.Parse dengan culture yang tepat tetap menjadi tanggung jawab pemanggil.