Tag Archives: glek

Memasukkan Data CSV ke MySQL

:: Beberapa hari yang lalu, saya diminta oleh seorang data analyst untuk memasukkan sekumpulan data di file CSV ke MySQL. Alhamdulillah ini mudah dilakukan di MySQL, dengan memanfaatkan perintah "LOAD DATA INFILE"

Isi dari file CSV tersebut adalah seperti ini :

======
NAMA; ALAMAT; TELPON; KODE POS
Saya; Jl. Jalan Disana; 0215554848; 12345
Kamu; Jl. Jalan Disini; 0215558348; 98765
======

Maka, perintah untuk memasukkannya ke sebuah table di MySQL dengan format fields yang sama adalah sebagai berikut : 

======
mysql -e "LOAD DATA INFILE '/tmp/tmp/inidata.csv' INTO TABLE datasaya.tablesaya FIELDS TERMINATED BY ';' LINES TERMINATED BY 'rn' "
======

Keterangan :

FIELDS TERMINATED BY ';' : karena setiap field di file CSV tersebut ternyata dipisahkan oleh ';', bukan koma.
LINES TERMINATED BY 'rn' : tanpa opsi ini, maka ketika data tersebut di SELECT, outputnya akan berantakan.

BERSIH-BERSIH

Pembaca yang bermata & bernalar tajam tentu akan langsung paham, bahwa, perintah tersebut diatas juga akan memasukkan record pertama 🙂 yaitu : 

======
NAMA; ALAMAT; TELPON; KODE POS
======

Untunglah solusinya mudah, yaitu perintah berikut ini :

======
mysql -e "DELETE FROM tablesaya WHERE kode_pos='KODE POS';"
======

BANYAK FILE

Happy ending ? Belum 🙂 karena, ternyata datanya ada ratusan ribu record, DAN tersebar di ratusan file, di puluhan sub-direktori…. #glek 

Untunglah ini dunia Unix / Linux 🙂 sehingga, solusinya cukup berupa script ringkas sbb :

=============
#!/bin/bash
DATABASE=datasaya
TABLE=tablesaya

#backup current table
mysqldump $DATABASE $TABLE > ~/backup/$DATABASE-$TABLE—`date +%d-%m-%Y`.mysql

# set line terminator to be n 
# (default: space)
# if this is not set, then $FILES content will be really messed up 
# when there are files with space in their name
IFS=$'n';

FILES="$(find /tmp/tmp -type f -name '*')"

for f in $FILES
do
  echo "Processing $f file…"

mysql -e "LOAD DATA INFILE '$f' INTO TABLE $DATABASE.$TABLE FIELDS TERMINATED BY ';' LINES TERMINATED BY 'rn' "
mysql -e "DELETE FROM $TABLE WHERE kode_pos='KODE POS';"

done
=============

Semoga bermanfaat.

Post imported by Google+Blog for WordPress.