diskusi.tech (beta) Community

loading...

Tokenizer untuk CSV

ariya profile image Ariya Hidayat ・1 min read

Misalnya begini contoh data dalam format CSV (Comma-separated values) yang hendak diolah:

Aceh, 17
Jambi  , -3
"DKI Jakarta", 2
"Bali, NTT, NTB", 5
Enter fullscreen mode Exit fullscreen mode

Maka akan repot kalau tiap baris hanya dipecah menggunakan String#split karena ada data yang diapit oleh tanda kutip ganda dan di dalamnya terdapat tanda koma.

Bagaimana caranya? Buatlah sebuah state machine sederhana. Untuk lengkapnya, berikutnya penjelasan langkah demi langkah!

Guna kelengkapan untuk bahan belajar lebih lanjut, silakan nikmati juga "kunci jawaban" berikut:

const fs = require('fs');

const content = fs.readFileSync('data2.txt', 'utf-8').toString();
const lines = content.split('\n');

const data = lines.map(line => {
  const cols = [];
  let state = 0;
  let str = '';
  for (let i = 0; i < line.length; ++i) {
    const ch = line[i];
    switch (state) {
      case 0:
        if (ch == '"') {
          state = 2;
          str = '';
        } else if (ch != ' ') {
          state = 1;
          str = ch;
        }
        break;
      case 1:
        if (ch != ',') {
          str += ch;
        } else {
          state = 0;
          cols.push(str);
          str = '';
        }
        break;
      case 2:
        if (ch != '"') {
          str += ch;
        } else {
          state = 3;
          cols.push(str);
          str = '';
        }
        break;
      case 3:
        if (ch == ',') {
          state = 0;
        }
        break;
    }
  }
  if (str.length > 0) cols.push(str);
  const provinsi = cols[0].trim();
  const jumlah = parseInt(cols[1], 10);
  return { provinsi, jumlah };
});

console.log(JSON.stringify(data, null, 2));
Enter fullscreen mode Exit fullscreen mode

Perhatikan! Ini hanya tutorial sederhana. Untuk memproses CSV sesuai spesifikasi, silakan kembangkan sendiri dan baca juga RFC 4180 secara rinci.

Discussion

pic
Editor guide