[note] node-csv 筆記
node-csv @ github
Parse:用來解析 CSV 檔案
💡 使用 Callback 或 Sync API 的方法(而非下方的 stream)會相對簡單。
// 使用 Stream
const csv = require('csv');
const path = require('path');
const fs = require('fs');
const fsPromises = fs.promises;
readAndParseCSV();
async function readAndParseCSV() {
try {
// STEP 1: 讀取 CSV 檔
const inputFilePath = path.resolve(__dirname, './foobar.csv');
const input = await fsPromises.readFile(inputFilePath);
// STEP 2:建立讀出 CSV 用的陣列和 parser
const output = [];
const parser = csv.parse({
delimiter: ',',
});
// STEP 3-1:建立對應事件 - 讀取資料
parser.on('readable', function () {
let record;
while ((record = parser.read())) {
output.push(record);
}
});
// STEP 3-2:錯誤處理
parser.on('error', function (err) {
console.error(err.message);
});
// STEP 3-3:取得最後 output 的結果
parser.on('end', function () {
console.log('output', output);
});
// STEP 4:放入預備讀取的內容
parser.write(input);
// STEP 5:關閉 readable stream
parser.end();
} catch (error) {
console.log('error', error);
}
}
使用 callback 搭配 Promise:
// 使用 callback
const parse = require('csv-parse');
const fs = require('fs');
const fsPromises = fs.promises;
const path = require('path');
const inputFilePath = path.resolve(__dirname, './mask-data.csv');
main();
async function main() {
const inputFile = await fsPromises.readFile(inputFilePath);
const parsedResult = await parseCSV(inputFile, {
delimiter: ',',
columns: true,
});
console.log('parsedResult', parsedResult);
}
function parseCSV(input, options) {
return new Promise((resolve, reject) => {
parse(input, options, (error, output) => {
if (error) {
console.error('[ERROR] parseCSV: ', error.message);
reject('[ERROR] parseCSV: ', error.message);
}
resolve(output);
});
});
}