readtable yang kita kenal di chapter-chapter sebelumnya pintar mendeteksi format — tapi “pintar menebak” tidak sama dengan “selalu benar”. Kolom tanggal kerap terbaca sebagai teks, nomor telepon kehilangan angka nol di depannya, dan kode pelanggan berformat 00123 berubah menjadi 123. Import options memberi kita kendali: periksa tebakan MATLAB lebih dulu, perbaiki tipenya, baru baca datanya. Cakupan chapter ini:

  • detectImportOptions untuk menginspeksi nama dan tipe kolom sebelum membaca
  • setvartype untuk memperbaiki kolom yang salah tipe
  • preview, rentang (Range), sheet, delimiter, dan penanganan nilai kosong
  • Padanan jalur klasik textscan untuk Octave

Masalah: Deteksi Otomatis yang Salah Tebak #

Berkas tabular menyimpan semuanya sebagai teks; pembacalah yang menentukan tipe. readtable menebak dengan cara memindai sampel baris, dan tiga tebakan klasik yang meleset:

GejalaPenyebabPerbaikan
kolom tanggal jadi char/string, bukan datetimeteks ISO seperti 2024-01-02 bisa terdeteksi teks biasasetvartype(opts, 'tanggal', 'datetime')
00123 menjadi 123kolom berisi digit ditebak doublesetvartype(opts, 'id', 'char')
tanda - atau N/A jadi NaN tanpa kabarplaceholder nilai kosong ikut terbacaTreatAsMissing pada saat deteksi

Perbaikan semua kasus itu membutuhkan satu prasyarat: melihat tebakan MATLAB sebelum data masuk memori.

detectImportOptions: Periksa Sebelum Membaca #

Mekanismenya: detectImportOptions(namaBerkas) memindai berkas dan mengembalikan object opts — rencana import yang belum dieksekusi. Kita membaca propertinya, mengubah yang perlu, lalu menyerahkan opts ke readtable. Kode berikut hanya berjalan di MATLAB (R2016b+):

matlab
% MATLAB-only di Octave: inspeksi tebakan tipe kolom (R2016b+)
opts = detectImportOptions('kasir.csv');
disp([opts.VariableNames' opts.VariableTypes'])

Tampilan disp memasangkan tiap nama kolom dengan tipenya — misalnya {'tanggal'} {'char'} dan {'nilai'} {'double'} — sehingga ketidakcocokan terlihat sebelum satu baris data pun dibaca. Properti yang paling sering kita sentuh:

Properti optsIsinyaKegunaan
VariableNamesnama tiap kolommengenali kolom yang akan diperbaiki
VariableTypestipe yang ditebakaudit tipe sebelum membaca
SelectedVariableNameskolom yang akan dibacamemfilter: baca sebagian kolom saja
VariableNamingRule'modify' (default) atau 'preserve'header bernama aneh diubah jadi identifier valid atau dipertahankan

Nilai 'modify' mengubah header seperti Tanggal Lahir menjadi TanggalLahir (tanpa spasi, sesuai aturan identifier); 'preserve' membiarkan nama asli — aksesnya jadi T.('Tanggal Lahir').

setvartype: Perbaiki Tipe Kolom #

Setelah audit menemukan kolom yang salah, setvartype mengganti tipenya di rencana import. Mekanismenya: opts = setvartype(opts, selection, type) mengubah kolom yang disebut di selection (satu nama atau cell array nama) menjadi type:

matlab
% MATLAB-only di Octave: perbaiki tipe lalu baca (R2016b+)
opts = detectImportOptions('kasir.csv');
opts = setvartype(opts, 'tanggal', 'datetime');
opts = setvartype(opts, 'nilai', 'int32');
T = readtable('kasir.csv', opts);

Pilihan type yang umum: 'char' dan 'string' untuk teks, 'double'/'single' untuk pecahan, 'int32'/'uint8' untuk bilangan bulat, 'datetime' untuk tanggal-waktu, 'logical' untuk kolom benar/salah, dan 'categorical' untuk kolom dengan sedikit kategori unik. Ganti banyak kolom sekaligus dengan cell array: setvartype(opts, {'nilai','diskon'}, 'single') — pola dari contoh resmi yang mengubah seluruh kolom teks patients.xls menjadi 'string'.

preview, Rentang, dan Sheet #

Berkas besar atau aneh layak diintip dulu. Mekanismenya: preview(namaBerkas, opts) mengembalikan delapan baris pertama mengikuti rencana opts — uji murah sebelum komitmen membaca jutaan baris:

matlab
% MATLAB-only di Octave: pratinjau, rentang, dan sheet
opts = detectImportOptions('kasir.csv');
opts.SelectedVariableNames = {'kasir', 'nilai'};   % hanya dua kolom ini
T8 = preview('kasir.csv', opts);

opts = detectImportOptions('laporan.xlsx', 'Sheet', 'Q1');
opts.DataRange = 'A5';                    % data mulai baris 5
T = readtable('laporan.xlsx', opts);

Argumen name-value saat deteksi menangani berkas yang tidak standar: NumHeaderLines melewati beberapa baris judul, Delimiter mengganti pemisah (misalnya ';' untuk CSV Eropa), TreatAsMissing menandai teks seperti '-' sebagai NaN, dan ReadVariableNames menentukan apakah baris pertama adalah nama kolom. Untuk spreadsheet, Sheet memilih lembar kerja dan DataRange/Range memotong area baca — 'A5' berarti mulai baris 5 kolom A.

Jalur Octave: textscan dengan Format Manual #

Octave tidak memiliki detectImportOptions/setvartype/readtable, tetapi filosofinya bisa direplikasi: textscan tidak pernah menebak — format specifier yang kita tulis adalah keputusan final. Kolom tanggal dibaca %s lalu dikonversi manual, kolom angka langsung %d:

matlab
fid = fopen('kasir.csv', 'r');
C = textscan(fid, '%s %s %d', 'Delimiter', ',', 'HeaderLines', 1);
fclose(fid);
tanggal = C{1};                    % kolom tanggal tetap berupa teks
kasir   = C{2};
nilai   = C{3};
fprintf('kolom kasir : %s %s %s\n', kasir{:});
fprintf('total nilai : Rp%d\n', sum(nilai));
tanggalNum = str2double(strrep(tanggal, '-', ''));
fprintf('tanggal num : %d %d %d\n', tanggalNum);

Output yang Dihasilkan:

text
kolom kasir : Budi Siti Ani
total nilai : Rp57500
tanggal num : 20240102 20240103 20240104

Mari kita bedah baris-baris kode di atas:

  1. Baris 2 ('%s %s %d'): tiga specifier adalah “setvartype manual” — tanggal dan kasir dikunci sebagai teks, nilai sebagai bilangan bulat; tidak ada tebakan yang bisa meleset.
  2. Baris 7 (tanggal = C{1}): tanggal 2024-01-02 aman sebagai char — nol dan tanda hubung tidak pernah hilang karena tidak ada konversi otomatis.
  3. Baris 11 (strrep(tanggal, '-', '')): konversi ke angka 20240102 terjadi hanya saat kita memintanya, lewat str2double setelah tanda hubung dibuang — kontrol penuh, hasil yang bisa diprediksi.

contoh.m pada bagian bawah halaman memakai guard exist: jalur detectImportOptions + setvartype + readtable berjalan di MATLAB, sedangkan di Octave jalur textscan di atas yang aktif — keduanya mencapai hasil yang sama.

Ringkasan #

detectImportOptions mengubah pembacaan tabel dari “tebak lalu baca” menjadi “audit, perbaiki, lalu baca”: opts.VariableTypes memperlihatkan tebakan tipe, setvartype membetulkannya, preview mengintip delapan baris pertama, dan name-value seperti Sheet, Range, Delimiter, TreatAsMissing menyesuaikan berkas yang tidak standar. Di Octave, padanannya adalah disiplin format manual textscan — tidak ada otomatisasi, tetapi juga tidak ada kejutan. Membaca dan menulis kini terkendali; sisanya manajemen berkas itu sendiri — folder, salin, pindah, bersihkan — di chapter File Management.