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, danfclose - Membaca baris demi baris dengan
fgetl - Membaca keseluruhan isi dengan
filereaddanstrsplit - Membaca kolom bertipe dengan
textscandan angka murni denganfscanf
Menulis Berkas Teks Terlebih Dahulu #
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:
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:
- 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. - Baris 2-5 (
fprintf(fid, ...)): argumen pertama adalah identifier, sehingga teks mengalir ke berkas, bukan ke layar. Format specifier tetap sama sepertifprintfke Command Window. - 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:
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:
baris 1: nama unit harga
baris 2: Budi 12 15000
total baris: 4Mari kita bedah baris-baris kode di atas:
- Baris 1 (
fopen(..., 'r')): berkas dibuka kembali dalam mode baca — berkasdata_teks.txtdari contoh sebelumnya dipakai ulang. - Baris 3-9 (
while true+fgetl): setiap iterasi menarik satu baris sebagai char array tanpa karakter newline. Pemeriksaan~ischar(baris)menghentikan loop tepat saatfgetlmengembalikan-1. - 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:
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:
fileread: 57 karakter, 4 barisMari kita bedah baris-baris kode di atas:
- Baris 1 (
fileread): seluruh 57 karakter — termasuk empat\n— kini hidup di satu variabelchar. - Baris 2-4 (
strsplit+ guard): berkas yang ditulis denganfprintf(..., '\n')diakhiri newline, sehinggastrsplitmenghasilkan satu elemen kosong di ujung; guardisemptymembuang 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:
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:
textscan nama : Budi Siti Andi
textscan unit : 12 15 9
pendapatan : Rp573000Mari kita bedah baris-baris kode di atas:
- Baris 2 (
'%s %d %d'): tiga specifier menghasilkan tiga cell array —C{1}berisi nama (cellofchar),C{2}danC{3}berisi angka bertipedouble. - Baris 2 (
'HeaderLines', 1): baris pertama (nama unit harga) dilewati karena berupa judul kolom, bukan data. - Baris 7 (
C{2} .* C{3}): kedua kolom langsung siap dihitung — unit dikalikan harga elemen demi elemen, lalusummenghasilkan 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:
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:
fscanf: 6 angka, rata-rata kolom 1: 31.33Mari kita bedah baris-baris kode di atas:
- Baris 6 (
fscanf(fid, '%f')): keenam angka terbaca berurutan menjadi vektor 6×1:30, 32, 31, 29, 33, 34. - Baris 9 (
reshape(v, 2, []).'):reshapemenyusun ulang menjadi 2×3 (dua elemen per kolom) sesuai column-major, lalu operator.'memutarnya menjadi 3×2 — baris pertama kembali berisi30 32seperti 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.
| Fungsi | Bentuk hasil | Cocok untuk |
|---|---|---|
fgetl | satu baris per panggilan | berkas besar, proses baris demi baris |
fileread | satu char berisi seluruh isi | berkas kecil, lalu dipecah strsplit |
textscan | cell kolom bertipe per format | berkas terstruktur dengan kolom tetap |
fscanf | vektor/matriks numerik | berkas angka murni |
readlines | string 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.