分析CSV而不下载/保存



我正在创建一个允许用户上传CSV的应用程序。CSV只是一个逗号分隔的文件。

在前端,我用PUT请求将文件发送到后端:

Reactjs|fileupload_frontend.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-parsernpm软件包来帮助解决此问题。

Nodejs|fileupload_backend.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:没有这样的文件或目录,打开"my,header,row,is,referenced,here">

。。。则数据如下所示。

我必须将CSV文件保存在某个目录中,然后先解析它吗?我只是在寻找一种将CSV解析为json的方法,这样我就可以将每一行作为一个条目插入到我的数据库中。

fs.createReadStream接受一个路径作为其参数,该路径可以是字符串、缓冲区或URL。

由于您传递了一个Buffer,它会尝试将Buffer作为路径打开,因此会出错

错误:ENOENT:没有这样的文件或目录,打开"my,header,row,is,referenced,here">

在将流管道传输到CSV解析器之前,需要从缓冲区创建流。对此有多种方法;实现使用缓冲区的Readable流就是其中之一例如

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

看看下面的包,https://www.npmjs.com/package/xlsx.它将允许您可互换地解析csv和大多数电子表格文件格式。

您可以通过以下方式使用它:

const XLSX = require('xlsx')
const workbook = XLSX.readFile(source_file_path)
const sheetName = workbook.SheetNames[0]
const sheet = workbook.Sheets[sheetName]
const obj = XLSX.utils.sheet_to_json(sheet)

这应该适用于库支持的任何电子表格格式。

这意味着文件必须保存在目录结构中的某个位置,XLSX.readFile才能工作。

这是我的解决方案,它直接使用缓冲区,不需要保存文件,只安装模块";csv解析";第一

const { parse } = require('csv-parse/sync');
const data = await parse(request.files.file.data); 

和回调版本

const csv = require('csv-parse');

csv.parse(request.files.file.data, function (err, data) {
console.log('my_data', data);
)}

最新更新