javascript - 无需下载/保存即可解析 CSV
问题描述
我正在创建一个允许用户上传 CSV 的应用程序。CSV 只是一个逗号分隔的文件。
在前端,我使用 PUT 请求将文件发送到后端:
反应js | 文件上传前端.js
sendFile = () => {
const data = new FormData();
data.append('file', this.myCSV_file);
axios.post('/parse-csv', data)
.then(response => console.log('File sent to server for parsing')
.catch(error => console.log(error);
}
上面的代码成功地将上传的 CSV(信息)发送到我的服务器,该服务器正在/parse-csv
端点上进行监听。
我正在使用csv-parser
npm 包来帮助解决这个问题。
节点| 文件上传后端.js
const csv = require('csv-parser');
const fs = require('fs');
const results = [];
app.post('/parse-csv', (request, response) => {
fs.createReadStream(request.files.file.data) { // this is a buffer on the req obj
.pipe(csv())
.on('data', results.push())
.on('end', (results) => {
console.log(results);
}
}
}
作为参考,从前端到后端的请求对象如下所示:
Request from upload { name: 'data.csv',
data: <Buffer 22 89 56 24 5y 86 k9 22 . ... >,
encoding: '7bit',
truncated: false,
mimetype: 'text/csv',
md5: [Function: md5],
mv: [Function: mv] }
每个请求都会出错,并带有一条似乎与我的标题行(csv 文件中的第一行)相关的消息,消息内容如下:
错误:ENOENT:没有这样的文件或目录,打开“我的,标题,行,是,引用,这里”
...然后数据如下所示。
我是否必须将 CSV 文件保存在某个目录中,然后先解析它?我只是在寻找一种将 CSV 解析为 json 的方法,因此我可以将每一行作为一个条目插入到我的数据库中。
解决方案
fs.createReadStream接受路径作为其参数,可以是字符串、缓冲区或 URL。
由于您通过了 a Buffer
,它会尝试将Buffer
a 作为路径打开,因此会出错
错误:ENOENT:没有这样的文件或目录,打开“我的,标题,行,是,引用,这里”
您需要先从 Buffer 创建一个流,然后再将其传送到 CSV 解析器。有多种方法可以解决这个问题;实现一个使用缓冲区的可读流就是其中之一。例如
const { Readable } = require('stream');
class BufferStream extends Readable {
constructor(opts) {
super(opts);
this.buf = opts.buf;
}
_read(size) {
this.push(this.buf);
this.push(null); // signal end of stream
}
}
现在实现请求处理程序以使用此类。
app.post('/parse-csv', (request, response) => {
const results = [];
const bufStream = new BufferStream(request.files.file.data);
bufStream.pipe(csv())
.on('data', (data) => results.push(data))
.on('end', (results) => {
console.log(JSON.stringify(results));
response.sendStatus(200);
}
}
}
推荐阅读
- python - 我发现错误“模块对象不可调用”
- amazon-web-services - 尝试在 aws emr 上另存为表时触发作业超时
- c# - XSLT 从文件中读取
- python - 通过 Python 中的 librosa.onset.detect 删除声音蜂鸣检测中的偏移
- node.js - 如何通过Id,node.js在rest API中发送多个帖子请求?
- kubernetes - ClusterRole 存在且无法导入当前版本?
- python - 在没有得到“切片警告副本”的情况下移动列
- c# - 如何覆盖自定义用户控件中的文本样式?
- python - Winsorizing 不会改变最大值
- mysql - 将group by子句的结果存储到sql中不同的excel文件中