CSV (Comma-Separated Values) adalah bahasa pengantar data paling universal: spreadsheet, database, dan hampir semua aplikasi analitik bisa mengeksport dan mengimpor format ini. Tugas kita sekarang memindahkan angka dari berkas CSV ke workspace MATLAB — menulisnya kembali, lalu mengatasi dua komplikasi klasik: baris header dan pemisah desimal koma. Cakupan chapter ini:

  • Menulis dan membaca CSV dengan readmatrix/writematrix (MATLAB R2019a+)
  • Padanan klasik csvread/csvwrite dan dlmread/dlmwrite
  • Melewati baris header dan mengganti delimiter
  • Membaca CSV sebagai table bernama kolom dengan readtable

Anatomi Berkas CSV #

Berkas CSV menyimpan tabel sebagai teks biasa: satu baris berkas = satu observasi, nilai dipisah karakter delimiter (umumnya koma), dan baris pertama sering berisi nama kolom. Tidak ada tipe data yang tersimpan — hanya angka dan teks apa adanya — sehingga pembaca harus menafsirkan ulang: "15000" dibaca sebagai angka, 15000.5 sebagai pecahan. Satu jebakan regional perlu diingat sejak awal:

WilayahDesimalDelimiter CSVContoh satu baris
AS, Inggristitikkoma12,15000.5
Indonesia, Jerman, Pranciskomatitik koma12;15000,5

Berkas dari aplikasi berbahasa Indonesia umumnya memakai titik koma sebagai delimiter — kita tangani dengan dlmread/dlmwrite di bawah.

readmatrix dan writematrix: Jalur Modern MATLAB #

Aturannya: readmatrix dan writematrix (keduanya R2019a+) adalah antarmuka baca-tulis yang disarankan MATLAB — otomatis mendeteksi format dari ekstensi .csv, .txt, atau .xlsx. Mekanismenya: readmatrix(namaBerkas) memindai berkas, mendeteksi delimiter dan baris header sendiri, lalu mengembalikan matriks numerik; writematrix(M, namaBerkas) menulis matriks dengan format sesuai ekstensi. Karena Octave tidak memiliki keduanya, contoh memakai guard exist yang memilih jalur modern bila tersedia:

matlab
M = [12 15000; 15 16000; 9 17000];

if exist('writematrix') ~= 0
  writematrix(M, 'penjualan.csv');           % MATLAB R2019a+
  fprintf('ditulis dengan writematrix\n');
else
  csvwrite('penjualan.csv', M);              % padanan klasik
  fprintf('ditulis dengan csvwrite\n');
end
fprintf('berkas tertulis: %d\n', exist('penjualan.csv', 'file'));

if exist('readmatrix') ~= 0
  A = readmatrix('penjualan.csv');           % MATLAB R2019a+
  fprintf('dibaca dengan readmatrix\n');
else
  A = csvread('penjualan.csv');              % padanan klasik
  fprintf('dibaca dengan csvread\n');
end
fprintf('roundtrip: %dx%d, A(2,2)=%d\n', size(A, 1), size(A, 2), A(2, 2));
fprintf('identik dengan data asli: %d\n', isequal(A, M));

Output yang Dihasilkan (jalur klasik yang aktif saat diuji di Octave — di MATLAB label menjadi writematrix/readmatrix, nilainya sama):

text
ditulis dengan csvwrite
berkas tertulis: 2
dibaca dengan csvread
roundtrip: 3x2, A(2,2)=16000
identik dengan data asli: 1

Mari kita bedah baris-baris kode di atas:

  1. Baris 3 (exist('writematrix') ~= 0): exist mengembalikan 0 bila fungsi tidak ada. Di MATLAB R2019a+ guard bernilai benar sehingga jalur modern aktif; di Octave guard bernilai salah sehingga padanan klasik berjalan — satu berkas, dua lingkungan.
  2. Baris 4 (writematrix(M, 'penjualan.csv')): tiap baris matriks menjadi satu baris berkas, tiap kolom dipisah koma; berkas lama dengan nama sama ditimpa.
  3. Baris 8 (csvwrite): padanan klasik dengan perilaku penulisan yang setara untuk matriks numerik.
  4. Baris 17 (isequal(A, M)): roundtrip dinyatakan sukses bila hasil baca identik elemen demi elemen — hasil 1 berarti tidak ada nilai yang berubah di perjalanan.

csvread dan csvwrite: Padanan Klasik #

csvread/csvwrite adalah fungsi generasi lama yang kini berstatus not recommended di dokumentasi MATLAB, tetapi tetap berguna sebagai padanan lintas-platform. Mekanismenya: csvread(namaBerkas, R, C) membaca mulai dari baris ke-R (indeks dari 0) dan kolom ke-C — cara resmi melewati header:

matlab
fid = fopen('jualan_header.csv', 'w');
fprintf(fid, 'unit,harga\n');
fprintf(fid, '%d,%d\n', M.');                % tulis per baris observasi
fclose(fid);

if exist('readmatrix') ~= 0
  B = readmatrix('jualan_header.csv');       % header terdeteksi otomatis
else
  B = csvread('jualan_header.csv', 1, 0);    % mulai baris ke-2, kolom ke-1
end
fprintf('dengan header: %dx%d, B(3,2)=%d\n', size(B, 1), size(B, 2), B(3, 2));

Output yang Dihasilkan:

text
dengan header: 3x2, B(3,2)=17000

Mari kita bedah baris-baris kode di atas:

  1. Baris 2-3 (fprintf ke berkas): header ditulis manual sebagai baris pertama, diikuti data per observasi; M.' ditranspose karena fprintf membaca elemen kolom demi kolom.
  2. Baris 9 (csvread('jualan_header.csv', 1, 0)): argumen 1, 0 berarti mulai dari baris kedua (indeks 0 = baris pertama), kolom pertama — baris unit,harga terlewati dan hasilnya murni angka 3×2.
  3. Baris 7 (readmatrix): jalur modern tidak butuh argumen geser karena readmatrix mendeteksi baris teks ber-header secara otomatis dan melewatkannya.

dlmread dan dlmwrite untuk Delimiter Lain #

Berkas bertitik-koma tidak bisa dibaca csvread karena fungsi tersebut terpaut pada koma. Mekanismenya: dlmread(namaBerkas, delimiter) dan dlmwrite(namaBerkas, M, 'delimiter', ..., 'precision', ...) menerima delimiter apa pun:

matlab
dlmwrite('data_titikoma.csv', [3.14159 2.71828], ...
         'delimiter', ';', 'precision', '%.4f');
D = dlmread('data_titikoma.csv', ';');
fprintf('delimiter titik koma: %.4f dan %.4f\n', D(1), D(2));

Output yang Dihasilkan:

text
delimiter titik koma: 3.1416 dan 2.7183

Mari kita bedah baris-baris kode di atas:

  1. Baris 1-2 (dlmwrite): pasangan name-value 'delimiter', ';' mengganti pemisah dan 'precision', '%.4f' membulatkan penulisan ke empat angka desimal — nilai 3.14159 tertulis sebagai 3.1416.
  2. Baris 3 (dlmread): argumen kedua ';' memberi tahu pembaca bahwa pemisah kolom adalah titik koma, bukan koma.

Untuk berkas desimal-koma di MATLAB modern, readmatrix juga menerima readmatrix(berkas, DecimalSeparator=",", ThousandsSeparator=".") — opsi name-value yang mengganti penafsiran tanda desimal tanpa mengubah berkasnya.

readtable: CSV dengan Kolom Bernama (MATLAB) #

Data CSV nyata sering berisi kolom teks (nama kasir) berdampingan dengan kolom angka — bentuk yang tidak muat dalam satu matriks numerik. Fungsi readtable (R2013b+) membaca berkas menjadi table: tiap kolom menjadi variabel bernama lengkap dengan tipenya. Kode berikut hanya berjalan di MATLAB:

matlab
T = readtable("jualan_header.csv");
T.Properties.VariableNames = {"unitTerjual", "hargaSatuan"};
totalPendapatan = sum(T.unitTerjual .* T.hargaSatuan);
writetable(T, "penjualan_rapi.csv");

Output yang Dihasilkan (tampilan Command Window MATLAB untuk T setelah penggantian nama):

text
T =
  3×2 table
    unitTerjual    hargaSatuan
    ___________    ___________
        12             15000
        15             16000
         9             17000

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (readtable): header unit,harga di baris pertama otomatis menjadi nama variabel; teks di kolom lain akan dibaca sebagai cell of char, bukan diubah menjadi NaN.
  2. Baris 2 (T.Properties.VariableNames): nama kolom diganti menjadi lebih deskriptif; akses kolom berubah dari T.unit menjadi T.unitTerjual.
  3. Baris 4 (writetable): tabel ditulis kembali sebagai CSV lengkap dengan baris header — padanan csvwrite yang sadar nama kolom.

Tipe Data dan Jebakan CSV #

CSV tidak menyimpan tipe: pembaca yang menentukan. csvread/readmatrix mengembalikan matriks numerik — sel kosong menjadi NaN, dan kolom teks tidak bisa dibaca csvread sama sekali. Bila berkas memuat teks campuran, pilihan yang benar adalah readtable (MATLAB) atau textscan dengan format %s (lintas-platform). Bila pemisah desimal berupa koma, berkas harus dibaca sebagai delimiter titik koma seperti contoh dlmread di atas; mencampur DecimalSeparator dengan delimiter koma membuat satu baris berisi dua makna sekaligus dan hasilnya tidak terbaca.

Berkas contoh.m pada bagian bawah halaman merangkai seluruh roundtrip — tulis-baca dengan guard modern/klasik, header, delimiter titik koma, dan pembersihan berkas demo — dalam satu script yang berjalan utuh di MATLAB maupun Octave.

Ringkasan #

readmatrix/writematrix adalah antarmuka modern untuk CSV numerik, readtable/writetable untuk CSV dengan kolom bernama, dan csvread/csvwrite/dlmread/dlmwrite menjadi padanan klasik yang kompatibel Octave. Pola guard exist membuat satu script memilih jalur yang tersedia. Header diatasi dengan deteksi otomatis (readmatrix), argumen geser (csvread), atau nama variabel (readtable); delimiter titik koma diatasi dengan dlmread/dlmwrite. Format yang menggabungkan angka, teks, dan formula dalam satu workbook — Excel — kita bahas di chapter berikutnya.