【问题标题】:Parsing of CSV file using Node/Express spits out weird \x001 codes使用 Node/Express 解析 CSV 文件会吐出奇怪的 \x001 代码
【发布时间】:2021-07-15 15:17:13
【问题描述】:

我正在使用 Node 和 Express 从我要解析的 URL 中获取 .CSV 文件。下载过程正常。

但是当我使用csv-parser 解析文件时,控制台中的输出如下所示:

只有成吨的看起来很奇怪的字节码?如果我使用 excel 或数字定期打开 CSV 文件,它工作正常。

这是 csv 文件中的数据的样子:

我的目标是使用 csv 解析器将每一行转换为一个对象 - 我见过很多解析器这样做的例子。

这是来自节点的代码:

const broadcasterController = require('./broadcasterController');
const https = require('https');
const fs = require('fs');
const parser = require('csv-parser');

exports.queryFi = async (io) => {
    // let today = new Date().toISOString().slice(0, 10);
    // let today = '2021-03-20';

    fetchInsidersCSV = async () => {
        //  Download a file and extract the destination
        function downloadFromUrl(url, dest) {
            return new Promise((resolve, reject) => {
                var file = fs.createWriteStream(dest);
                https.get(url, function (response) {
                    response.pipe(file);
                    file.on('finish', function () {
                        file.close();
                        resolve(dest);
                    });
                }).on('error', function (err) {
                    // Handle errors
                    fs.unlinkSync(dest);
                    reject(new Error('Download failed.'));
                });
            });
        }
        await downloadFromUrl(
            `https://marknadssok.fi.se/Publiceringsklient/sv-SE/Search/Search?SearchFunctionType=Insyn&Utgivare=&PersonILedandeSt%C3%A4llningNamn=&Transaktionsdatum.From=&Transaktionsdatum.To=&Publiceringsdatum.From=2021-04-01&Publiceringsdatum.To=2021-04-01&button=export&Page=1`,
            'bar.csv'
        );
    };

    try {
        const results = [];
        // crawl the web page and start att page 1
        await fetchInsidersCSV();

        fs.createReadStream('bar.csv')
            .pipe(parser({ separator: ';' }))
            .on('data', (data) => results.push(data))
            .on('end', () => {
                console.log(results);
            });

    } catch (error) {
        console.log(error);
    }
};

谁能帮我提供一个输出正确的代码解决方案?

【问题讨论】:

    标签: node.js csv text-parsing byte-order-mark character-set


    【解决方案1】:

    在我看来,数据采用utf-16 编码。所以如果我们在 fs.createReadStream() 中指定这个,我们应该得到正确的结果:

    fs.createReadStream('bar.csv', { encoding: "utf-16le" })
        .pipe(parser({ separator: ';' }))
        .on('data', (data) => results.push(data))
        .on('end', () => {
            console.log(results);
        });
    

    使用此设置,我看到如下输出:

    [
      {
        Publiceringsdatum: '2021-04-01 23:59:28',
        Utgivare: 'Attana AB',
        'LEI-kod': '549300KAI93YCW5ISI45',
        'Anmälningsskyldig': 'Arne Nabseth',
        'Person i ledande ställning': 'Arne Nabseth',
        Befattning: 'Styrelseordförande',
        'Närstående': '',
        Korrigering: '',
        'Beskrivning av korrigering': '',
        'Är förstagångsrapportering': 'Ja',
        'Är kopplad till aktieprogram': '',
        'Karaktär': 'Avyttring',
        Instrumenttyp: 'Aktie',
        Instrumentnamn: 'Attana ',
        ISIN: 'SE0015222583',
        Transaktionsdatum: '2021-02-26 00:00:00',
        Volym: '80000',
        Volymsenhet: 'Antal',
        Pris: '1,6',
        Valuta: 'SEK',
        Handelsplats: 'NORDIC SME',
        Status: 'Aktuell',
        '': ''
      }
    ]
    

    【讨论】:

      【解决方案2】:

      csv-parser contains an option 查看、正确处理和删除输入文件开头的字节顺序标记 (BOM)。你可以这样使用它:

          fs.createReadStream('bar.csv')
                  .pipe(parser({ separator: ';', bom: true }))
      

      解析器对utf-8utf-16leutf-16be 字符集执行正确的操作。即使输入文件不包含 BOM,它也能正常工作。

      如果您无法控制创建 csv 文件,这是一个不错的方法。

      【讨论】:

        猜你喜欢
        • 2018-02-28
        • 1970-01-01
        • 1970-01-01
        • 2013-01-11
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 2016-08-17
        相关资源
        最近更新 更多