问题描述
我正在使用 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);
}
};
解决方法
在我看来,数据采用 utf-16 编码。所以如果我们在 fs.createReadStream() 中指定这个,我们应该得到正确的结果:
/v1/invoices
使用此设置,我会看到如下输出:
fs.createReadStream('bar.csv',{ encoding: "utf-16le" })
.pipe(parser({ separator: ';' }))
.on('data',(data) => results.push(data))
.on('end',() => {
console.log(results);
});
,
csv-parser contains an option 查看、正确处理和删除输入文件开头的字节顺序标记 (BOM)。你可以这样使用它:
fs.createReadStream('bar.csv')
.pipe(parser({ separator: ';',bom: true }))
解析器对 utf-8
、utf-16le
和 utf-16be
字符集做正确的事情。即使输入文件不包含 BOM,它也能正常工作。
如果您无法控制创建 csv 文件,这是一个很好的方法。