Node.js และ การจัดการกับไฟล์ CSV

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)
    })
})

Key-Value CSV

หากเรามีค่า 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' } ]
})

Synchronouse 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)
    })

つづく