在 JavaScript (Node.js) 中处理 CSV:完整指南
CSV(逗号分隔值)是交换表格数据最流行的格式之一。在 Node.js 生态系统中,有多个强大的库可用于解析、生成和处理 CSV 文件。在本文中,我们将介绍主要工具、它们的安装、使用示例和最佳实践。
Node.js 中用于处理 CSV 的流行库
在 JavaScript (Node.js) 中,最常用于处理 CSV 的三个库是:
- csv-parser — 一个快速的流式解析器,以 streaming 模式工作
- csv-stringify — 从 JavaScript 对象或数组生成 CSV 的生成器
- fast-csv — 一个通用库,结合了解析和生成功能
安装库
使用 npm 安装所需的包:
npm install csv-parser csv-stringify fast-csv使用 csv-parser 解析 CSV
csv-parser 库以流模式工作,允许处理任意大小的文件而无需将其完全加载到内存中。
示例:读取 CSV 文件
const fs = require('fs');const csv = require('csv-parser');
const results = [];
fs.createReadStream('data.csv') .pipe(csv()) .on('data', (row) => { results.push(row); }) .on('end', () => { console.log('CSV 文件已成功处理'); console.log('第一行:', results[0]); });默认情况下,csv-parser 将文件的第一行用作标题,并返回具有相应键的对象。
使用 csv-stringify 生成 CSV
csv-stringify 库允许从 JavaScript 数组或对象创建 CSV 字符串。
示例:从对象创建 CSV
const { stringify } = require('csv-stringify');const fs = require('fs');
const data = [ { name: '伊万', age: 25, city: '莫斯科' }, { name: '玛丽亚', age: 30, city: '圣彼得堡' }, { name: '阿列克谢', age: 28, city: '喀山' }];
const writableStream = fs.createWriteStream('output.csv');
const stringifier = stringify({ header: true, columns: ['name', 'age', 'city']});
stringifier.pipe(writableStream);data.forEach(row => stringifier.write(row));stringifier.end();通用解决方案:fast-csv
fast-csv 提供了解析和生成 CSV 的功能,并支持各种格式(TSV、自定义分隔符)。
示例:使用 fast-csv 解析 CSV
const fs = require('fs');const csv = require('@fast-csv/parse');
const rows = [];
fs.createReadStream('data.csv') .pipe(csv.parse({ headers: true })) .on('error', error => console.error(error)) .on('data', row => rows.push(row)) .on('end', (rowCount) => { console.log(`已处理 ${rowCount} 行`); console.log('数据:', rows); });示例:使用 fast-csv 写入 CSV
const fs = require('fs');const csv = require('@fast-csv/format');
const data = [ ['姓名', '年龄', '城市'], ['伊万', '25', '莫斯科'], ['玛丽亚', '30', '圣彼得堡']];
const ws = fs.createWriteStream('output.csv');csv.write(data, { headers: true }).pipe(ws);处理大文件与性能
当处理超过 100 MB 的 CSV 文件时,建议使用流式处理。所有三个讨论的库都支持流。
示例:逐行处理大 CSV 文件
const fs = require('fs');const csv = require('csv-parser');
let rowCount = 0;
fs.createReadStream('large-file.csv') .pipe(csv()) .on('data', (row) => { rowC