Apa itu CSV? CSV atau Comma Separated Values adalah file text yang berisi daftar data tabular yang masing-masing kolomnya dipisahkan oleh karakter tertentu, biasanya dipisahkan oleh karakter koma (,) atau semicolon (;). CSV merupakan file yang murni file teks dengan encoding biasanya ASCII atau Unicode, sangat jarang terdapat data binary di dalamnya , dan dapat dicetak layaknya file teks. File csv sangat berguna untuk pertukaran data misal untuk spreadsheet dan database, karena dapat menyimpan banyak row/baris data dengan format yang sederhana. Format CSV memiliki kekurangan misalnya :
- terkait security atau keamanan , tidak ada dukungan native terkait security data
- Format csv sangat sederhana, menggunakan delimiter (koma, semikolon, tab, |) untuk pemisahan kolom data. Hal ini yang bisa jadi menimbulkan rentan salah format / data corrupt jika csv berisi string / teks panjang dengan karakter simbol simbol yang kompleks
- Delimiter bisa jadi tidak standar dan berbeda, pada beberapa aplikasi seperti excel/ spreadshet harus ditentukan dahulu delimiter yang dipakai melalui fitur text-to-row
- Tidak adanya dukungan native terkait tipe data dan metadata dari struktur data yang dimuat di dalam file CSV. Pengolahan data melalui aplikasi harus menentukan sendiri tipe data sesuai kolom yang ada.
Meski demikian, CSV masih banyak dipakai di perusahaan perusahaan untuk pertukaran data karena sifatnya portable, sederhana, simple, berbasis file teks, dan dapat memuat jutaan baris data.
Melalui tulisan ini kita akan mencoba membuat aplikasi sederhana yang membaca data dari file teks CSV. Meskipun file CSV merupakan file dengan format yang sangat Kuno, tetapi masih banyak di perusahaan perusahaan yang menjual aplikasi untuk ETL dan Import data dari CSV dengan nilai fantastis hingga milyaran..!
Banyak dari kita melakukan import CSV dengan cara tertentu yang ternyata lambat sehingga performa aplikasi lambat. Ada yang dengan cara membaca teks file CSV, split row dengan cara split berdasarkan cr-lf atau karakter enter, lalu dapatkan data perkolom dengan split menggunakan koma atau titik koma. Solusi ini akan sangat lambat sekali jika dilakukan looping untuk data dengan jumlah row lebih dari 100.000 row.
Ada juga yang menggunaka metode OLEDB dan driver MSADODB, membuat koneksi ke file CSV menggunakan connection MSADODB, cara ini praktis tapi bisa membuat rigid. Kita harus mengandalkan DRIVER OleDB / MSADODB dan harus dipastikan terinstall. Hal ini menyebabkan host OS jadi rigid dengan installasi installasi driver OLEDB tersebut, yang bisa jadi muncul konflik driver antara 32 bit dan 64 bit. Namun sayangnya bagaimana jika aplikasi harus berjalan di lingkungan linux/unix / non windows, maka jelas bisa jadi tidak dapat running sama sekali. Selain itu oledb connection untuk query ke file csv layaknya SQL Query, memiliki beberapa keterbatasan dan isu performa jika ukuran file csv sangat besar. Beberapa case akan mengalami masalah tipe data ketika dilakukan select.
Download Sample File CSV
Supaya tidak report dengan menyediakan file sample CSV, kita bisa mengunduhnya dari data public yang tersedia online, misalnya dari alamat website: https://www.datablist.com/learn/csv/download-sample-csv-files#people-dataset
Website tersebut menyediakan data contoh People, Customer, organization dalam format csv dengan jumlah ROW per file yang bervariasi. Untuk file dengan 500.000 rows bisa diunduh dari link contoh https://drive.google.com/uc?id=1gYcKeeF2KIx3jHsn-Egc_zjv-VaI4LFw&export=download
Sebaiknya unduh semua contoh file dalam berbagai jumlah row yang bervariasi, baik 1000, 10000, 100000, 500000, hingga 1000000.

Membuat Project Aplikasi
Kita menggunakan IDE Visual Studio 2022 Community Edition untuk membuat aplikasi. Create new project dengan tipe project Console App, dan beri nama project dengan nama ConsoleAppCSV. Pada target framework, pilih target ke .net 9.0. Lalu create aplikasi.

Pada Solution Explorer atau struktur project, klik kanan lalu pilih Manage Nuget Package. Beriktu nuget package yang kita butuhkan
- CsvHelper, versi minimum 33.1
- ConsoleTables, versi minimum 27.1
Tambahkan kedua nuget package utama tersebut ke dalam aplikasi.

Apabila dilihat pada Solution Explorer maka struktur proyek minimal yang kita buat akan nampak seperti berikut ini.

Coding Import File CSV
Sebelum memulai koding, kita jelaskan terlebih dahulu konsepnya. Jadi langkah yang diperlukan untuk import CSV adalah berikut flow nya:
- Mendapatkan file path lokasi file CSV
- Membuat class model yang merepresentasikan tiap row dari file CSV
- Melakukan mapping antara kolom di CSV dengan property field dari class model. Mapping dapat berupa urutan index kolom atau nama kolom pada header CSV.
- Membuat new instance dari stream reader untuk membaca file CSV
- Membuat new instance CSV reader berdasarkan stream reader yang telah dibuat
- Load row dari CSV sehingga di dapat List Object berisi row data yang siap dipakai

Seperti yang terlihat di Gambar 5, Kita akan menggunakan file CSV data People yang memiliki kolom berupa: Index,User Id,First Name,Last Name,Sex,Email,Phone,Date of birth,Job Title. Pertama tama kita buat class dengan nama PeopleModel yang memiliki property yang mewakili kolom kolom dari data People yang ada di CSV
public class PeopleModel
{
public long Index { get; set; }
public string? UserId { get; set; }
public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? Sex { get; set; }
public string? Email { get; set; }
public string? Phone { get; set; }
public DateTime? DateOfBirth { get; set; }
public string? JobTitle { get; set; }
}
Setelah kita menambahkan file class PeopleModel, kita set attribute untuk setiap property sehingga dapat termapping property tersebut diambil dari file CSV kolom urutan ke berapa. Perhatikan listing kode PeopleModel yang telah disesuaikan berikut ini.
using CsvHelper.Configuration.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleAppCSV
{
[CultureInfo("en-US")]
[Delimiter(",")]
[Quote('"')]
[HasHeaderRecord(true)]
public class PeopleModel
{
[Index(0)]
public long Index { get; set; }
[Index(1)]
public string? UserId { get; set; }
[Index(2)]
public string? FirstName { get; set; }
[Index(3)]
public string? LastName { get; set; }
[Index(4)]
public string? Sex { get; set; }
[Index(5)]
public string? Email { get; set; }
[Index(6)]
public string? Phone { get; set; }
[NullValues("")]
[Format("yyyy-MM-dd")]
[Index(7)]
public DateTime? DateOfBirth { get; set; }
[Index(8)]
public string? JobTitle { get; set; }
}
}
Apabila sudah dibuat class model PeopleModel, selanjutnya edit file Program.cs. Kita akan menambahkan kode utama aplikasi. Pertama kita buat kode untuk menerima input nama file, dan mengeceknya apakah file exist atau tidak. Jika file tidak ditemukan maka harus muncul alert. Perhatikan kode berikut.
Console.Write("Mohon masukkan nama file CSV (Fullpath/Relative path): ");
var filename = Console.ReadLine();
var csvFilePath = string.Empty;
if (System.IO.File.Exists(filename))
{
csvFilePath = filename;
}
else
{
csvFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, filename);
if (!System.IO.File.Exists(filename))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"Sorry, File Not Found in path : {csvFilePath}");
return;
}
}
Selanjutnya, dari file path CSV kita baca isi file nya menjadi list object. Kita terlebih dahulu membuat object CsvConfiguration yang otomatis dibuat dari class model PeopleModel. Fungsi FromAttributes otomatis membaca attribut mapping yang ada di property dari class PeopleModel. Untuk membaca csv, kita cukup memanggil method GetRecords dari object CsvReader. Perhatikan listing kode berikut ini:
var csvConfig = CsvConfiguration.FromAttributes<PeopleModel>(new System.Globalization.CultureInfo("en-US"));
csvConfig.Delimiter = ",";
csvConfig.HasHeaderRecord = true;
using (var reader = new StreamReader(csvFilePath))
using(var csv = new CsvHelper.CsvReader(reader, csvConfig))
{
var csvrows = csv.GetRecords<PeopleModel>().ToList();
/// pengolahan hasil rows
}
Kita dapat menggunakan ConsoleTable. Library ini memudahkan menampilkan data tabular dari List Object menjadi tabel yang lebih rapi pada console aplikasi, sehingga coding kita menjadi lebih sederhana.
Berikut ini listing kode lengkap.
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Console.Write("Mohon masukkan nama file CSV (Fullpath/Relative path): ");
var filename = Console.ReadLine();
var csvFilePath = string.Empty;
if (System.IO.File.Exists(filename))
{
csvFilePath = filename;
}
else
{
csvFilePath = System.IO.Path.Combine(Environment.CurrentDirectory, filename);
if (!System.IO.File.Exists(filename))
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"Sorry, File Not Found in path : {csvFilePath}");
return;
}
}
Console.ForegroundColor= ConsoleColor.Green;
Console.WriteLine($"Reading csv file : {csvFilePath}\r\n");
var startTime = DateTime.Now;
var csvConfig = CsvConfiguration.FromAttributes<PeopleModel>(new System.Globalization.CultureInfo("en-US"));
csvConfig.Delimiter = ",";
csvConfig.HasHeaderRecord = true;
using (var reader = new StreamReader(csvFilePath))
using(var csv = new CsvHelper.CsvReader(reader, csvConfig))
{
var csvrows = csv.GetRecords<PeopleModel>().ToList();
var endTime = DateTime.Now;
var elapsed = endTime - startTime;
Console.WriteLine($"Total Rows : {csvrows.Count}");
Console.WriteLine($"Elapsed Time : {elapsed.TotalMilliseconds:0.####} ms");
Console.WriteLine("Please press enter to show table data !!");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Read();
ConsoleTable.From<PeopleModel>(csvrows)
.Configure(cfg =>
{
cfg.NumberAlignment = Alignment.Right;
cfg.EnableCount = true;
})
.Write(Format.Alternative);
Console.WriteLine("\r\nAll Data is Displayed ! Please press enter to EXIT !!\r\n");
Console.ForegroundColor = ConsoleColor.White;
Console.Read();
}
}
}
Apabila kita jalankan , maka tampilan aplikasi akan seperti berikut ini


Analisa Data
Kita akan mencoba berkali kali menjalankan aplikasi, menggunakan file csv data people dengan jumlah row yang berbeda beda, mulai dari 1000, 10000, 100000, 500000, 1000000, hingga 2000000 row data. Setiap percobaan kita catat elapsed time nya, waktu ini adalah waktu yang dibutuhkan membaca file csv dan meload data ke dalam list object di memory.




Berikut ini adalah tabel data hasil percobaan lama waktu yang diperlukan untuk masing masing jumlah row dari 100 hingga 2000000 row.

Dari hasil percobaan dapat kita lihat bahwa butuh waktu 2.5 detik untuk meload 1.000.000 row, dengan kecepatan load 390row per milisecond. Dan butuh waktu 4.5 detik untuk meload data 2.000.000 row, dengan kecepatan load 445 row per milisecond. Kecepatan ini relatif lebih cepat dibandingkan kita melakukan split teks dan split string menggunakan koma/semikolon, lalu looping per baris.
Kesimpulan
Csv merupakan format file yang masih banyak dipakai sehingga penting untuk mengetahui metode mengolah dan mengimport data dari CSV. Salah satu metode import csv dengan menggunakan library csvhelper , hasilnya relatif cepat dengan kecepatan 390row per milisecond dan butuh waktu 2.5 detik untuk load row sebanyak 1000000 row.
Untuk download listing kode, bisa download sini (File CSV tidak disertakan, harap download dari link di atas)


