使用 Node/Express 解析 CSV 文件会吐出奇怪的 \x001 代码
Posted
技术标签:
【中文标题】使用 Node/Express 解析 CSV 文件会吐出奇怪的 \\x001 代码【英文标题】: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);
;
谁能帮我提供一个输出正确的代码解决方案?
【问题讨论】:
【参考方案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-8
、utf-16le
和utf-16be
字符集执行正确的操作。即使输入文件不包含 BOM,它也能正常工作。
如果您无法控制创建 csv 文件,这是一个不错的方法。
【讨论】:
以上是关于使用 Node/Express 解析 CSV 文件会吐出奇怪的 \x001 代码的主要内容,如果未能解决你的问题,请参考以下文章
如何解析 node.js、express.js、mysql2 中“rows”对象的数据