Membaca berkas data

Mengimpor CSV dan Excel dengan readmatrix dan readcell serta alternatif lintas implementasi csvread dan dlmread.

Daftar isi

Analisis di MATLAB selalu bermula dari data yang berhasil masuk ke workspace. Topik ini membahas pengimporan data dari berkas: membaca CSV numerik dengan readmatrix, data campuran teks dan angka dengan readcell, padanan lintas implementasi csvread dan dlmread, serta textscan untuk berkas yang memuat baris judul. Setelah membaca topik ini, fungsi pembaca dapat dipilih sesuai bentuk berkas sehingga data mentah pengukuran maupun nilai ujian siap diolah tanpa pengetikan manual.

Membaca data numerik dengan readmatrix#

Fungsi readmatrix membaca satu berkas tabel dan mengembalikan isinya sebagai matriks numerik. Setiap baris berkas menjadi satu baris matriks, setiap kolom berkas menjadi satu kolom matriks, sehingga data hasil pengukuran berkolom seragam langsung siap diolah dengan operasi matriks biasa. Fungsi ini mengenali format dari ekstensi berkasnya, sehingga berkas .csv maupun .xlsx ditangani dengan pemanggilan yang sama. Sel yang kosong atau berisi teks yang tidak dapat dikonversi menjadi angka dilaporkan sebagai NaN, singkatan dari not a number, sehingga letak data yang hilang tetap terlihat pada hasil pembacaan.

matlab Contoh: readmatrix pada berkas csv dan Excel
% tidak-dijalankan
% baca seluruh isi berkas csv menjadi matriks numerik
M = readmatrix('data-suhu.csv');

% baca lembar pertama berkas excel menjadi matriks
X = readmatrix('pengukuran.xlsx');

Nilai balik berupa matriks membuat readmatrix cocok ketika seluruh kolom berkas memang sejenis, misalnya catatan sensor yang seluruhnya berisi angka. Ketika berkas memuat kolom label seperti nama stasiun atau nama peserta ujian, pembacaan menjadi matriks tidak lagi tepat karena teks akan rusak menjadi NaN. Kebutuhan semacam itu dilayani oleh readcell yang dipaparkan pada bagian berikut.

Membaca data campuran dengan readcell#

Fungsi readcell membaca berkas menjadi cell array, yakni array yang setiap selnya dapat menampung nilai dengan tipe berbeda. Satu sel memuat teks, sel di sebelahnya dapat memuat angka, dan keduanya tetap utuh apa adanya. Akses satu nilai dilakukan dengan kurung kurawal berindeks, misalnya C{2, 1} mengambil sel baris kedua kolom pertama. Pola ini menjaga kolom nama tetap berupa teks pada saat kolom nilai sudah dapat diambil sebagai angka.

matlab Contoh: readcell dan akses satu sel
% tidak-dijalankan
% baca berkas excel yang memuat nama dan nilai ujian
C = readcell('nilai-uji.xlsx');

% ambil nama peserta pada baris kedua kolom pertama
nama = C{2, 1};

% ambil nilai ujian peserta itu pada kolom kedua
nilai = C{2, 2};

Konsekuensi dari keleluasaan tipe adalah pemrosesan yang lebih hati-hati. Isi setiap sel perlu diperiksa kelasnya sebelum dipakai dalam perhitungan numerik, dan sel yang kosong tetap kosong sehingga pemeriksaan keberadaan nilai menjadi bagian dari alur pembersihan data. Untuk berkas yang seluruhnya numerik, readmatrix tetap menjadi pilihan yang lebih ringkas.

Padanan lintas implementasi: csvread dan dlmread#

Fungsi csvread membaca berkas CSV yang seluruh isinya numerik dan mengembalikan matriks, sehingga perilakunya sejajar dengan readmatrix untuk kasus berkas numerik murni. Berkas contoh berikut memuat catatan sensor suhu yang diambil tiap lima menit pada dua kolom, yaitu menit pengukuran dan suhu yang terbaca.

csv data-suhu.csv
0,36.5
5,36.6
10,36.8
15,37.1
20,36.9
25,36.7

Pembacaan seluruh isi berkas cukup memanggil csvread dengan satu argumen nama berkas. Ukuran hasilnya menegaskan bahwa enam baris dan dua kolom berkas menjadi matriks dengan bentuk yang sama.

matlab Membaca seluruh isi csv dengan csvread
M = csvread('data-suhu.csv')
size(M)
text Keluaran
M =

         0   36.5000
    5.0000   36.6000
   10.0000   36.8000
   15.0000   37.1000
   20.0000   36.9000
   25.0000   36.7000

ans =

   6   2

Fungsi dlmread melakukan tugas yang sama dengan dua keleluasaan tambahan, yaitu pembatas kolom dapat ditentukan sendiri dan bagian berkas yang dibaca dapat dibatasi ke satu rentang. Argumen pembatas diikuti dua angka yang menyatakan baris dan kolom awal pembacaan dengan penghitungan mulai dari nol. Pemanggilan berikut membaca berkas yang sama mulai baris ketiga sehingga dua pengukuran pertama dilewati.

matlab Membaca sebagian berkas dengan dlmread
D = dlmread('data-suhu.csv', ',', 2, 0)
text Keluaran
D =

   10.000   36.800
   15.000   37.100
   20.000   36.900
   25.000   36.700

Hasilnya matriks empat kali dua berisi pengukuran menit ke-10 sampai ke-25. Pembatas koma tetap disebut secara eksplisit karena dlmread tidak mengkhususkan diri pada CSV, sehingga berkas berpembatas spasi, tab, atau titik koma dibaca dengan cara yang sama. Rentang pembacaan berguna ketika berkas memuat catatan panjang dan analisis hanya memerlukan jendela tertentu, tanpa perlu memuat seluruh isi ke memori.

Membaca berkas berjudul dengan textscan#

Berkas data sehari-hari sering memulai isinya dengan baris judul seperti nama kolom. Pembaca csvread tidak memahami baris judul sehingga berkas berikut perlu dibaca dengan fungsi yang dapat melewatinya.

csv catatan-suhu.csv
menit,suhu
0,36.5
5,36.6
10,36.8
15,37.1
20,36.9
25,36.7

Fungsi textscan membaca dari sebuah pegangan berkas (file handle) yang dibuka dengan fopen. Format %f%f berarti dua angka per baris, opsi HeaderLines melewati satu baris judul, dan opsi Delimiter menetapkan koma sebagai pembatas. Hasilnya berupa cell array yang setiap elemennya menampung satu kolom data. Pegangan berkas wajib ditutup dengan fclose setelah pembacaan selesai.

matlab Membaca berkas berjudul dengan textscan
fid = fopen('catatan-suhu.csv', 'r');
data = textscan(fid, '%f%f', 'HeaderLines', 1, 'Delimiter', ',');
fclose(fid);
menit = data{1};
suhu = data{2};
fprintf('menit  suhu\n');
fprintf('%5.0f  %.1f\n', [menit'; suhu']);
text Keluaran
menit  suhu
    0  36.5
    5  36.6
   10  36.8
   15  37.1
   20  36.9
   25  36.7

Baris judul tidak pernah muncul pada hasil karena dilewati sebelum pembacaan angka dimulai. Format %f%f juga bekerja sebagai penyaring: baris yang tidak sesuai pola dua angka menghentikan pembacaan, sehingga teks yang menyusup di tengah data terdeteksi lebih cepat. Ketika berkas memuat kolom teks, formatnya ditulis dengan %s pada posisi kolom tersebut dan hasilnya tetap berupa kolom tersendiri di dalam cell array. Pola buka, baca, tutup seperti ini menjadi cetak biru untuk semua pembacaan berkas yang butuh kendali penuh atas format.

Alur lengkap dari berkas ke ringkasan#

Pembacaan baru berguna ketika hasilnya segera diolah. Skrip berikut merangkai seluruh langkah dari membaca berkas sampai menghitung ringkasan statistik. CSV dimuat dengan csvread, kolom menit dan kolom suhu dipisahkan lewat pengindeksan kolom, lalu skrip melaporkan banyak sampel, nilai tertinggi, dan rata-rata suhu. Skrip ini dapat dijalankan apa adanya karena berkas data-suhu.csv berada satu folder dengannya.

matlab impor_suhu.m
% impor_suhu.m: membaca berkas csv lalu menghitung ringkasan

% baca seluruh kolom numerik
M = csvread('data-suhu.csv');

% pisahkan menjadi dua kolom: waktu dan nilai terukur
menit = M(:, 1);
suhu = M(:, 2);

fprintf('banyak sampel: %d\n', numel(menit));
fprintf('suhu tertinggi: %.1f derajat\n', max(suhu));
fprintf('rata-rata suhu: %.2f derajat\n', mean(suhu));
text Keluaran
banyak sampel: 6
suhu tertinggi: 37.1 derajat
rata-rata suhu: 36.77 derajat

Pemisahan kolom dilakukan setelah pembacaan, bukan saat pembacaan, karena csvread memang mengembalikan satu matriks utuh. Rata-rata 36,77 derajat menegaskan bahwa seluruh isi berkas benar-benar ikut terbaca, karena nilai itu hanya dapat diperoleh dari keenam pengukuran. Pola pisah lalu olah seperti ini bekerja untuk berkas berapa pun banyak kolomnya selama seluruh kolom numerik. Ketika sumber data berganti, hanya baris pertama skrip yang perlu disesuaikan karena seluruh alur berikutnya bekerja atas matriks hasil pembacaan itu.

Memilih fungsi pembaca#

Tabel berikut merangkum fungsi pembaca beserta kegunaannya. Pilihan fungsi yang tepat bergantung pada dua hal, yaitu jenis data di dalam berkas dan kebutuhan kendali atas format pembacaan.

FungsiKeluaranKekuatanKapan dipakai
readmatrixmatriks numerikformat dikenali otomatisseluruh kolom berupa angka
readcellcell arraytiap sel berisi tipe sendirikolom campuran teks dan angka
csvreadmatriks numerikpadanan lintas implementasiCSV numerik murni
dlmreadmatriks numerikpembatas bebas dan rentangberkas teks berpembatas selain koma
textscancell array kolomformat dan baris judul diatur sendiriberkas berjudul atau format khusus

Fungsi modern readmatrix dan readcell tetap menjadi pilihan utama pada MATLAB karena keduanya mengenali format berkas secara otomatis dan menangani sel kosong dengan teratur. Fungsi klasik csvread, dlmread, dan textscan dipertahankan karena berjalan pada kedua implementasi dan memberi kendali eksplisit atas pembatas, baris judul, serta format kolom. Ketika sebuah skrip ditujukan untuk pembaca yang mungkin memakai implementasi selain MATLAB, fungsi klasik inilah yang menjaga skrip tetap berjalan di mana pun.

Urutan pemeriksaan yang praktis sebelum menulis kode: buka berkas dengan editor teks, lihat apakah baris pertama berupa judul, dan periksa apakah semua kolom berisi angka. Dari hasil pemeriksaan itu, pilih fungsi dengan bentuk keluaran yang paling dekat dengan kebutuhan analisis. Pilihan yang tepat sejak awal menghemat seluruh pekerjaan pembersihan data di langkah-langkah berikutnya. Sebabnya, konversi antara matriks, cell array, dan teks justru sering memakan waktu lebih banyak daripada pembacaan berkasnya.

Kesalahan umum#

  • Berkas tidak ditemukan karena path. Fungsi pembaca mencari nama berkas relatif terhadap Current Folder, bukan terhadap folder tempat skrip berada. Skrip yang berjalan baik pada satu folder tiba-tiba gagal ketika dijalankan dari folder lain. Perbaikannya adalah menempatkan berkas data pada folder kerja yang sama, atau menyebut jalur berkas secara lengkap pada pemanggilan fungsi.
  • Membaca berkas berjudul dengan csvread. Baris judul menit,suhu tidak dapat dikonversi menjadi angka sehingga csvread mengembalikan baris nol pada posisinya tanpa memicu error apa pun. Hasil seperti itu menyesatkan karena tampak seperti data sah. Gunakan textscan dengan opsi HeaderLines untuk berkas berjudul, atau dlmread dengan baris awal satu.
  • Lupa opsi Delimiter pada textscan. Format %f%f pada berkas berpembatas koma tanpa opsi 'Delimiter', ',' membuat pembacaan berhenti di kolom pertama karena koma tidak dikenali sebagai pemisah. Selalu sertakan opsi pembatas yang sesuai dengan berkas, sebab pembatas bawaan textscan adalah spasi.

Ringkasan#

  • readmatrix mengembalikan matriks numerik dari berkas CSV atau Excel dan menandai sel yang gagal dikonversi sebagai NaN.
  • readcell mengembalikan cell array yang mempertahankan tipe tiap sel sehingga kolom nama dan kolom angka dapat hidup berdampingan.
  • csvread dan dlmread adalah padanan lintas implementasi untuk data numerik, dengan dlmread menambahkan pilihan pembatas dan rentang pembacaan.
  • textscan membaca berkas berjudul melalui pegangan berkas, format per kolom, dan opsi HeaderLines, lalu hasilnya diambil per kolom dari cell array.

Referensi#