DEFINISI
Kata Parsing (parse) berasal dari Bahasa
inggris yang memiliki arti mengurai. Maka, parsing
data adalah suatu kegiatan untuk
mengurai suatu data.
Dalam
pemrograman misal di Arduino, kegiatan parsing data dapat
dikaitkan sebagai suatu kegiatan untuk mengolah suatu paket data masukkan dengan
cara memisahkan paket data tersebut ke dalam uraian-uraian data yang akan
diolah ke tahap berikutnya.
FUNGSI
- Pemilihan dan pengambilan data pada suatu paket data masukan.
- Mempermudah komunikasi data karena dengan adanya metoda parsing, pengirim hanya perlu memberi satu line paket data yang didalamnya sudah mencakup banyak data.
CONTOH
Paket data masukan
:
“A100B124C14D15”
A,B,C,D
sebagai identifier.
100,
124,14,15, sebagai value dari identifier.
Terurai menjadi
data-data sebagai berikut:
1. A = 100
2. B = 124
3. C = 14
4. D = 15
Dimana A,B,C,
dan D adalah data-data yang akan diolah selanjutnya.
IMPLEMENTASI PADA PROGRAM
Berikut hanyalah contoh sketsa program pada sebuah project
String dataIn;
//variabel penampung
String
YAW[10]; //variabel string array penampung data uraian YAW
String
PITCH[10]; //variabel string array penampung data uraian PITCH
int i, X, Y; // indeks-indeks
array data penampung, dataIn, YAW, PITCH
boolean
parsing = false; //Inisialisasi (just in case)
//variabel penampung hasil parsing
int
Position_YAW ;
int
Position_PITCH;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0) //jika ada serial
{
char inChar = (char)Serial.read(); //serial in char per char
dataIn += inChar; //tampung char
if (inChar == ' ') //indikasi paket data selesai (CR)
{
parsing = true;
}
}
if (parsing)
{
parsingData(); //panggil
fungsi parsing
parsing = false; //parsing selesai
dataIn = " "; //data penampung dihapus
}
}
void parsingData()
{
Serial.print("data masuk : ");
Serial.print(dataIn);
Serial.print("\n");
for (i = 0; i < dataIn.length(); i++) //scan
string penampung per 1 karakter
{
if (dataIn[i] == 'Y') //jika pengenal Y untuk YAW terbaca
{
Y++; // maka
indeks penampung YAW +1
YAW[Y] = ""; // kosong sebelum diisi
}
else
{
YAW[Y] = YAW[Y] + dataIn[i]; //Array indeks ke-Y penampung data YAW
dibuffer
}
if (dataIn[i] == 'X') //jika
pengenal X untuk PITCH terbaca
{
X++; // maka indeks penampung PITCH +1
PITCH[X] = "";
}
else
{
PITCH[X] = PITCH[X] + dataIn[i]; //Array
indeks ke-X penampung data PITCH dibuffer
}
}
if (PITCH[X] == "")
{
Serial.print("YAW : ");
Serial.print(YAW[Y].toInt());
Serial.print("\n");
Serial.print("PITCH : ");
Serial.print('0');
Serial.print("\n");
}
if (YAW[Y] == "")
{
Serial.print("YAW : ");
Serial.print(YAW[Y].toInt());
Serial.print("\n");
Serial.print("PITCH : ");
Serial.print('0');
Serial.print("\n");
}
else
{
Serial.print("YAW : ");
Serial.print(YAW[Y].toInt());
Serial.print("\n");
Serial.print("PITCH : ");
Serial.print( PITCH[X].toInt());
Serial.print("\n");
}
//hasil
parsing tampung ke dalam integer
Position_YAW = YAW[Y].toInt();
Position_PITCH = PITCH[X].toInt();
}
PENJELASAN
Fungsi di loop:
void loop()
{
if (Serial.available() > 0) //jika ada serial
{
char inChar = (char)Serial.read(); //serial in char per char
dataIn += inChar; //tampung char
if (inChar == ' ') //indikasi paket data selesai (CR)
{
parsing = true;
}
}
if (parsing)
{
parsingData(); //panggil
fungsi parsing
parsing = false; //parsing
selesai
dataIn = " "; //data penampung dihapus
}
}
Serial arduino membaca data byte per byte. Satu byte
tersebut ditampung ke inChar. Lalu,
data inChar ditumpuk di variabel penampung/buffer dataIn. Setelah ada indikasi paket data selesai dengan adanya
carriage return – dalam hal ini
menggunakan spasi (“ “) – parsing data dilakukan dengan memanggil fungsi parsingData();
Fungsi parsing :
void parsingData()
{
Serial.print("data masuk : ");
Serial.print(dataIn);
Serial.print("\n");
for (i = 0; i < dataIn.length(); i++) //scan
string penampung per 1 karakter
{
if (dataIn[i] == 'Y') //jika pengenal Y untuk YAW terbaca
{
Y++; // maka
indeks penampung YAW +1
YAW[Y] = ""; // kosong sebelum diisi
}
else
{
YAW[Y] = YAW[Y] + dataIn[i]; //Array indeks ke-Y penampung data YAW
dibuffer
}
if (dataIn[i] == 'X') //jika
pengenal X untuk PITCH terbaca
{
X++; // maka indeks penampung PITCH +1
PITCH[X] = "";
}
else
{
PITCH[X] = PITCH[X] + dataIn[i]; //Array
indeks ke-X penampung data PITCH dibuffer
}
}
...
//hasil
parsing tampung ke dalam integer
Position_YAW = YAW[Y].toInt();
Position_PITCH = PITCH[X].toInt();
}
Konsep utama dari parsing ini adalah melakukan scanning terhadap variabel buffer/penampung dataIn. Rangkaian string dataIn di-scan huruf demi huruf dengan menggunakan perulangan yang mengontrol indeks string dataIn[i].
dataIn[1] = huruf ke satu dari dataIn, dataIn[2] = huruf ke dua dst. Dicek satu per satu menggunakan perulangan.
Isi blok perulangan tersebut adalah perkondisian (IF) untuk mencari identifier data yang dimaksud saat proses scanning. Dalam kasus program di atas, identifier yang dimaksud adalah Y dan X.
if (dataIn[i] == 'Y')
Jika identifier bertemu dengan kondisi, maka indeks array dari variabel uraian yang bersangkutan bertambah (increment), dan variable array[indeks] tersebut siap di isi. Saat kondisi (IF) tidak bertemu lagi dengan identifier maka blok ELSE dijalankan. Blok ELSE akan menampung data uraian berdasarkan nilai di paket data.
TRACING
dataIn = “A100B124C14D15”
dataIn[0] = ‘A’ ; dataIn[1] = ‘1’ ; dataIn[2] = ‘0’ ; dataIn[3] = ‘0’ dst…
perulangan ke-1 , dataIn[0]
if (dataIn[0] == 'A') //bertemu identifier
a++;
Output :
a = 1
perulangan
ke-2 , dataIn[1]
else
//karena dataIn[1] == ‘1’ (tidak bertemu identifier)
dataA[a] = dataA[a]
+ dataIn[1];
Output :
dataA[1] = ‘ ‘ + ‘1’
à dataA[1]
= ‘1’
perulangan
ke-3, dataIn[2]
else
//karena dataIn[2] == ‘0’ (tidak bertemu identifier)
dataA[a] =
dataA[a] + dataIn[2];
Output :
dataA[1] = ‘1’ + ‘0’
à dataA[1]
= ‘10’
perulangan
ke-4, dataIn[3]
else
//karena dataIn[3] == ‘0’ (tidak bertemu identifier)
dataA[a] =
dataA[a] + dataIn[3];
Output :
dataA[1] = ‘10’ + ‘0’ à dataA[1] = ‘100’
Lalu ditampung ke
variabel integer lain untuk diolah (tergantung kebutuhan) misal;
Data_Paramter_A
= dataA[a] .toInt();
Sebenarnya ada banyak metoda parsing data, tergantung kasusnya bagaimana. Namun di atas adalah salah satu caranya.