如何使用Node.js将CSV文件转换为JSON文件?现有读取代码求改造
嘿,我来帮你把CSV转成JSON!你现在的代码已经能读取CSV内容了,只差把收集到的数据写入JSON文件这一步,很简单的,我给你拆解一下步骤:
首先,我们需要一个数组来暂存所有读取到的CSV行数据,等所有数据都读完之后,把这个数组转成JSON字符串,再写入到文件里。这里分两种情况,取决于你的CSV有没有表头:
情况1:你的CSV有表头(第一行是列名)
比如你的translation.csv长这样:
id,original,translation
1,Hello,你好
2,World,世界
这种情况下,我们可以让fast-csv把每一行转换成键值对对象,生成的JSON结构会更清晰。完整代码如下:
const fs = require('fs'); const csv = require('fast-csv'); const path = require('path'); // 用来存储转换后的所有数据 const jsonData = []; // 读取CSV文件,开启表头解析模式 fs.createReadStream(path.resolve(__dirname, 'translation.csv')) .pipe(csv({ headers: true })) // 关键:开启后每行转为对象,键就是表头列名 .on('data', (row) => { // 把每一行对象添加到数组中 jsonData.push(row); }) .on('end', () => { // 所有数据读取完成后,写入JSON文件 fs.writeFile('translation.json', JSON.stringify(jsonData, null, 2), (err) => { if (err) { console.error('写入JSON文件时出错了:', err); return; } console.log('搞定!CSV已经成功转成JSON文件啦~'); }); }) .on('error', (err) => { console.error('读取CSV文件时出错了:', err); });
运行这个脚本后,你会得到translation.json,内容大概是:
[ { "id": "1", "original": "Hello", "translation": "你好" }, { "id": "2", "original": "World", "translation": "世界" } ]
情况2:你的CSV没有表头(纯数据行)
如果你的CSV就是纯数据,没有列名,比如:
1,Hello,你好
2,World,世界
那我们直接把每行的数组存起来就行,代码只需要去掉headers: true:
const fs = require('fs'); const csv = require('fast-csv'); const path = require('path'); const jsonData = []; fs.createReadStream(path.resolve(__dirname, 'translation.csv')) .pipe(csv()) .on('data', (row) => { // row是一个数组,比如['1', 'Hello', '你好'],直接存入数组 jsonData.push(row); }) .on('end', () => { fs.writeFile('translation.json', JSON.stringify(jsonData, null, 2), (err) => { if (err) { console.error('写入失败:', err); return; } console.log('转换完成!'); }); }) .on('error', (err) => { console.error('读取CSV出错:', err); });
生成的JSON会是数组的数组:
[ ["1", "Hello", "你好"], ["2", "World", "世界"] ]
几个小提示:
- 用
path.resolve(__dirname, 'translation.csv')可以避免路径问题,不管你在哪个目录下运行脚本,都能正确找到CSV文件。 JSON.stringify的第三个参数2是用来格式化JSON的,让它有缩进,可读性更好;如果不需要格式化,可以改成JSON.stringify(jsonData),生成压缩后的JSON。- 别忘了监听
error事件,不然脚本出错了你可能不知道原因哦~
内容的提问来源于stack exchange,提问作者Adnan Butt
相关产品推荐
相关产品推荐

