-2

我正在创建一个使用 axios 向该 URL 发出 GET 请求的 Node/Express 后端: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 文件看起来就像它应该的样子。看这里:

在此处输入图像描述

4

1 回答 1

0

您可以使用以下示例。它下载一个 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);
    });
});

于 2021-04-09T12:28:18.037 回答