Catatan sensor, hasil export spreadsheet, log server — semuanya tiba di meja kita sebagai berkas teks. Sebelum dianalisis, MATLAB harus membaca berkas itu menjadi variabel di workspace, dan caranya bergantung bentuk isinya: baris demi baris, keseluruhan sekaligus, atau kolom bertipe yang rapi. Chapter ini membahas pilihan tersebut:

  • Menulis berkas teks dengan fopen, fprintf, dan fclose
  • Membaca baris demi baris dengan fgetl
  • Membaca keseluruhan isi dengan fileread dan strsplit
  • Membaca kolom bertipe dengan textscan dan angka murni dengan fscanf

Aturannya: setiap operasi baca-tulis teks berporos pada file identifier — angka yang MATLAB keluarkan lewat fopen. Mekanismenya: fopen(namaBerkas, 'w') membuka (atau membuat) berkas dalam mode tulis dan mengembalikan identifier; fprintf dengan identifier itu menulis data ke berkas, bukan ke Command Window; fclose menutup berkas dan memaksa seluruh isi buffer benar-benar ditulis ke disk. Kita buat dulu berkas uji berisi data penjualan tiga kasir:

matlab
fid = fopen('data_teks.txt', 'w');
fprintf(fid, 'nama unit harga\n');
fprintf(fid, 'Budi 12 15000\n');
fprintf(fid, 'Siti 15 16000\n');
fprintf(fid, 'Andi 9 17000\n');
fclose(fid);

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (fopen(..., 'w')): mode 'w' berarti write — berkas baru dibuat bila belum ada, dan isi lama ditimpa bila sudah ada. Mode 'r' untuk baca dan 'a' untuk append di akhir berkas.
  2. Baris 2-5 (fprintf(fid, ...)): argumen pertama adalah identifier, sehingga teks mengalir ke berkas, bukan ke layar. Format specifier tetap sama seperti fprintf ke Command Window.
  3. Baris 6 (fclose(fid)): tanpa baris ini, sebagian isi bisa tersangkut di buffer internal dan berkas tampak kosong atau setengah jadi.

Membaca Baris demi Baris dengan fgetl #

Masalah nyatanya: berkas besar tidak muat diproses sekaligus, dan sering kita hanya perlu memindai tiap baris (misalnya menghitung baris log). Mekanismenya: fgetl(fid) membaca satu baris dan memajukan posisi baca; saat mencapai akhir berkas fgetl mengembalikan -1 (angka, bukan teks), sehingga pemeriksaan ischar menjadi penanda alami bahwa baris masih berisi teks:

matlab
fid = fopen('data_teks.txt', 'r');
nBaris = 0;
while true
  baris = fgetl(fid);
  if ~ischar(baris), break; end   % fgetl = -1 di akhir berkas
  nBaris = nBaris + 1;
  if nBaris <= 2
    fprintf('baris %d: %s\n', nBaris, baris);
  end
end
fclose(fid);
fprintf('total baris: %d\n', nBaris);

Output yang Dihasilkan:

text
baris 1: nama unit harga
baris 2: Budi 12 15000
total baris: 4

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (fopen(..., 'r')): berkas dibuka kembali dalam mode baca — berkas data_teks.txt dari contoh sebelumnya dipakai ulang.
  2. Baris 3-9 (while true + fgetl): setiap iterasi menarik satu baris sebagai char array tanpa karakter newline. Pemeriksaan ~ischar(baris) menghentikan loop tepat saat fgetl mengembalikan -1.
  3. Baris 7-8 (fprintf): dua baris pertama ditampilkan sebagai sampel; sisanya hanya dihitung.

Hasil fgetl berupa satu char array — untuk mengambil kolomnya, fungsi strsplit memecah baris menjadi cell array token: strsplit('Budi 12 15000', ' ') menghasilkan {'Budi','12','15000'}, lalu str2double mengonversi token angka menjadi double.

Membaca Keseluruhan Isi dengan fileread #

Untuk berkas kecil, membaca satu per satu terasa lambat. Mekanismenya: fileread(namaBerkas) membaca seluruh isi sekali jalan dan mengembalikannya sebagai satu char array — termasuk karakter \n di tiap akhir baris. Kombinasi fileread + strsplit menghasilkan daftar baris dalam satu cell array:

matlab
isi = fileread('data_teks.txt');
barisSemua = strsplit(isi, '\n');
if isempty(barisSemua{end})          % newline terakhir membuang elemen kosong
  barisSemua(end) = [];
end
fprintf('fileread: %d karakter, %d baris\n', numel(isi), numel(barisSemua));

Output yang Dihasilkan:

text
fileread: 57 karakter, 4 baris

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (fileread): seluruh 57 karakter — termasuk empat \n — kini hidup di satu variabel char.
  2. Baris 2-4 (strsplit + guard): berkas yang ditulis dengan fprintf(..., '\n') diakhiri newline, sehingga strsplit menghasilkan satu elemen kosong di ujung; guard isempty membuang elemen itu agar hitungan baris akurat.

Membaca Kolom Bertipe dengan textscan #

Berkas data_teks.txt punya struktur tetap: nama, unit, harga — berulang tiap baris. textscan dibuat untuk pola seperti ini. Mekanismenya: textscan(fid, formatSpec) menerapkan format berulang sampai akhir berkas, lalu mengembalikan satu cell array per conversion specifier — kolom pertama char, dua kolom berikutnya double:

matlab
fid = fopen('data_teks.txt', 'r');
C = textscan(fid, '%s %d %d', 'HeaderLines', 1);
fclose(fid);

fprintf('textscan nama : %s %s %s\n', C{1}{:});
fprintf('textscan unit : %d %d %d\n', C{2});
pendapatan = sum(C{2} .* C{3});
fprintf('pendapatan   : Rp%d\n', pendapatan);

Output yang Dihasilkan:

text
textscan nama : Budi Siti Andi
textscan unit : 12 15 9
pendapatan   : Rp573000

Mari kita bedah baris-baris kode di atas:

  1. Baris 2 ('%s %d %d'): tiga specifier menghasilkan tiga cell array — C{1} berisi nama (cell of char), C{2} dan C{3} berisi angka bertipe double.
  2. Baris 2 ('HeaderLines', 1): baris pertama (nama unit harga) dilewati karena berupa judul kolom, bukan data.
  3. Baris 7 (C{2} .* C{3}): kedua kolom langsung siap dihitung — unit dikalikan harga elemen demi elemen, lalu sum menghasilkan total pendapatan Rp573.000.

Membaca Angka Murni dengan fscanf #

Berkas berisi murni angka — deret suhu, hasil pengukuran — paling cepat dibaca fscanf. Mekanismenya: fscanf(fid, '%f') membaca seluruh angka menjadi satu vektor kolom sesuai urutan column-major; matriks dibentuk dengan reshape lalu transpose karena fscanf mengisi kolom demi kolom sementara berkas tersusun baris demi baris:

matlab
fid = fopen('suhu.txt', 'w');
fprintf(fid, '30 32\n31 29\n33 34\n');   % 3 baris x 2 kolom
fclose(fid);

fid = fopen('suhu.txt', 'r');
v = fscanf(fid, '%f');
fclose(fid);
suhu = reshape(v, 2, []).';          % isi ulang per kolom lalu transpose
fprintf('fscanf: %d angka, rata-rata kolom 1: %.2f\n', numel(v), mean(suhu(:, 1)));

Output yang Dihasilkan:

text
fscanf: 6 angka, rata-rata kolom 1: 31.33

Mari kita bedah baris-baris kode di atas:

  1. Baris 6 (fscanf(fid, '%f')): keenam angka terbaca berurutan menjadi vektor 6×1: 30, 32, 31, 29, 33, 34.
  2. Baris 9 (reshape(v, 2, []).'): reshape menyusun ulang menjadi 2×3 (dua elemen per kolom) sesuai column-major, lalu operator .' memutarnya menjadi 3×2 — baris pertama kembali berisi 30 32 seperti di berkas.

Fungsi Modern: readlines #

MATLAB R2020b menyediakan readlines yang meringkas fileread + strsplit menjadi satu panggilan: S = readlines("data_teks.txt") mengembalikan string array N×1 — satu elemen per baris, tanpa elemen kosong tersisa. Opsi EmptyLineRule="skip" membuang baris kosong; WhitespaceRule="trim" memangkas spasi di awal/akhir baris. Karena hasilnya bertipe string, fungsi ini hanya berjalan di MATLAB — padanan lintas-platform-nya adalah pola fileread + strsplit di atas.

FungsiBentuk hasilCocok untuk
fgetlsatu baris per panggilanberkas besar, proses baris demi baris
filereadsatu char berisi seluruh isiberkas kecil, lalu dipecah strsplit
textscancell kolom bertipe per formatberkas terstruktur dengan kolom tetap
fscanfvektor/matriks numerikberkas angka murni
readlinesstring array N×1 (R2020b+)pembacaan satu langkah di MATLAB modern

Berkas contoh.m pada bagian bawah halaman merangkai seluruh siklus — menulis berkas uji, membaca baris per baris, memecah strsplit, mem-parse textscan, membaca angka fscanf, lalu menghapus berkas demo — dalam satu script yang berjalan utuh.

Ringkasan #

Membaca teks di MATLAB berarti memilih granularitas: fgetl untuk baris demi baris, fileread untuk seluruh isi sebagai char, textscan untuk kolom bertipe, dan fscanf untuk angka murni. Semua jalur berporos pada fopen/fclose dan identifier berkas, dengan mode 'w', 'r', 'a' yang menentukan arah aliran data. Untuk data yang berformat tabel dengan pemisah koma, MATLAB punya fungsi khusus yang lebih ringkas — kita bahas di chapter berikutnya: Membaca File CSV.