问题描述
我正在创建一个 Node/Express 后端,它使用 axios 向以下 URL 发出 GET 请求:https://marknadssok.fi.se/Publiceringsklient/sv-SE/Search/Search?SearchFunctionType=Insyn&Utgivare=&PersonILedandeSt%C3%A4llningNamn=&Transaktionsdatum.From=&Transaktionsdatum.To=&Publiceringsdatum.From=2021-03-30&Publiceringsdatum.To=2021-03-30&button=export&Page=1
当使用常规浏览器时,响应是文件下载,数据为 CSV 文件。
有没有办法在我正在构建的 Node/Express 后端读取和解析这个 CSV 文件?我不希望将数据保存到文件系统或任何东西。只需使用诸如“csv-parse”之类的库将这个 CSV 文件转换为文件中每一行的对象。
提前致谢!
编辑:
当我尝试在 console.log 时直接读取文件的示例时,jsonArray 如下所示:
实际的 CSV 文件看起来应该如此。看这里:
解决方法
您可以使用以下示例。它会下载一个 CSV 文件,读取并删除它。但是,您提供链接的 CSV 文件中使用的分隔符,形式为 \x00
,文件看起来像那样。最好的办法是使用不同的 CSV 文件或逐行解析生成的 CSV 文件。我想你可以针对这个问题开一个不同的问题。
const fs = require('fs');
const csv = require('csvtojson');
const https = require('https');
let url = "https://marknadssok.fi.se/Publiceringsklient/sv-SE/Search/Search?SearchFunctionType=Insyn&Utgivare=&PersonILedandeSt%C3%A4llningNamn=&Transaktionsdatum.From=&Transaktionsdatum.To=&Publiceringsdatum.From=2021-03-30&Publiceringsdatum.To=2021-03-30&button=export&Page=1";
async function parseCSV(url) {
const dest = __dirname + '/foo.csv'; // You can use uuid like packages to name the csv file
return new Promise((resolve,reject) => {
var file = fs.createWriteStream(dest);
https.get(url,function (response) {
response.pipe(file);
file.on('finish',function () {
file.close();
csv({
noheader:true,trim:true
}).fromFile(dest).then(jsonArray => {
fs.unlinkSync(dest);
resolve(jsonArray);
})
});
}).on('error',function (err) { // Handle errors
fs.unlinkSync(dest);
reject(new Error("Download failed."));
});
});
}
parseCSV(url).then( result => {
result.forEach(row => {
row = row.field1;
console.log(row);
});
});