CSV หรือ Comma Separated Value เป็นไฟล์ Open Format ที่ใช้ในการแลกเปลี่ยนข้อมูลระหว่างระบบ 2 ระบบ ถึงแม้ว่าในปัจจุบัน ไฟล์ JSON อาจจะเป็นเป็นที่นิยมมากกว่าแต่เนื่องจากยังคงมี DataSet ตัวอย่างข้อมูลที่น่าสนใจนิยมเผยแพร่รูปแบบของไฟล์ CSV เช่น จากบัญชี GitHub ของอาจารย์ประเสริฐ (prasertcbs
) ซึ่งมี DataSet สำหรับฝึกเขียนโปรแกรมในด้าน Data Science ให้ดาวน์โหลดอย่างมากมาย ดังนั้นไฟล์ CSV จึงมีความน่าสนใจที่จะนำมาใช้ในการแลกเปลี่ยนข้อมูลระหว่างระบบของเรากับระบบภายนอก ซึ่ง Node.js เองก็มีไลบรารี่ที่สามารถทำงานร่วมกับ CSV ได้ครบถ้วนทุกขั้นตอน
csv
ไลบรารี่ csv
ของ Node.js นั้นรองรับการทำงานตั้งแต่การสร้าง CSV, การ Parse CSV, การ Transform CSV รวมไปถึงการแปลงค่า CSV ให้กลับไปอยู่ในรูปของ String แต่ในบทความนี้จะเน้นการใช้งานฟังก์ชั่น parse()
เป็นหลัก
csv
Terminal
yarn add csv
yarn add csv-parse
csv
เราจะทดลองเขียนโปรแกรมโดยการกำหนด CSV ในรูปแบบของ String และจะใช้ฟังก์ชั่น parse()
จากไลบรารี่ csv
ในการ Parse CSV ให้อยู่ในรูปแบบของ Array of Array
ซึ่งการทำงานของฟังก์ชั่น parse() นั้น จะเป็นการประมวลผลในแบบ Asynchronous
Code
const { parse } = require('csv')
const csv = 'A,20,FOO\nB,30,BAR'
parse(csv, (err, records) => {
if (err) {
console.log(err.message)
return
}
console.log(records) // [ [ 'A', '20', 'FOO' ], [ 'B', '30', 'BAR' ] ]
records.forEach(each => {
const [F1, F2, F3] = each
console.log(F1, F2, F3)
})
})
หากเรามีค่า CSV แบบเดียวกับโปรแกรมในเวอร์ชั่นแรก ก็จะเห็นว่า การนำผลลัพธ์ไปใช้นั้น ยังไม่มีความสะดวกเพราะผลลัพธ์อยู่ในรูปแบบของ Array of Array ดังนั้นในเวอร์ชั่นนี้เราจะลองกำหนดค่า CSV ในรูปแบบใหม่ คู่กับการกำหนดค่า columns: true
ให้กับ ฟังก์ชั่น parse()
เพิ่มเติม
Code
const csv = 'F1|F2|F3\nA|20|FOO\nB|30|BAR'
const options = {
columns: true
}
parse(csv, options, (err, records) => {
console.log(records) // [ { F1: 'A', F2: '20', F3: 'FOO' }, { F1: 'B', F2: '30', F3: 'BAR' } ]
})
parse()
ในโปรแกรมเวอร์ชั่นสุดท้ายนี้ เราจะเรียกใช้ DataSet จาก GitHub ผ่าน URL https://raw.githubusercontent.com/prasertcbs/basic-dataset/master/bank/bank.csv แล้วจึงนำมาประมวลผลโดยใช้ฟังก์ชั่น parse()
เนื่องจาก DataSet ที่ถูกนำมาใช้ในตัวอย่างนี้ เป็น CSV ที่คั่นด้วยเครื่องหมาย ;
เราจึงต้องมีการตั้งค่า delimiter: ';'
ให้กับ ฟังก์ชั่น parse()
เพิ่มเติม
ซึ่งในครั้งนี้เราจะเรียกใช้ฟังก์ชั่น parse()
ในเวอร์ชั่นที่ทำงานในแบบ Synchronous
Fields
age
job
marital
education
default
balance
housing
loan
contact
day
month
duration
campaign
pdays
previous
poutcome
y
Code
const { parse } = require('csv/lib/sync')
const axios = require('axios')
const url = 'https://raw.githubusercontent.com/prasertcbs/basic-dataset/master/bank/bank.csv'
axios.get(url)
.then(res => {
const options = {
columns: true,
delimiter: ';'
}
const records = parse(res.data, options)
console.log(records)
})