所以我正在解析一个大的csv文件并将结果推送到mongo。
该文件为maxminds city database。它有各种有趣的utf8字符。我仍然在某些城市名称中得到(?)符号。以下是我阅读文件的方式:
(使用csv节点模块)
csv().from.stream(fs.createReadStream(path.join(__dirname, 'datafiles', 'cities.csv'), {
flags: 'r',
encoding: 'utf8'
})).on('record', function(row,index){
.. uninteresting code to add it to mongodb
});
我在这里做错了什么? 我在mongo:加拿大Ch teauguay获得这样的东西
修改:
我尝试使用不同的lib来读取文件:
lazy(fs.createReadStream(path.join(__dirname, 'datafiles', 'cities.csv'), {
flags: 'r',
encoding: 'utf8',
autoClose: true
}))
.lines
.map(String)
.skip(1) // skips the two lines that are iptables header
.map(function (line) {
console.log(line);
});
它会产生同样糟糕的结果: 154252, “PA”, “03”, “Capellana”, “”,8.3000,-80.5500 ,, 154220,“AR”,“01”,“VillaEspa a”,“”, - 34.7667,-58.2000 ,,
答案 0 :(得分:2)
结果maxmind在latin1中编码他们的东西。
这有效:
var iconv = require('iconv-lite')
lazy(fs.createReadStream(path.join(__dirname, 'datafiles', 'cities.csv')))
.lines
.map(function(byteArray) {
return iconv.decode(byteArray, 'latin1');
})
.skip(1) // skips the two lines that are iptables header
.map(function (line) {
//WORKS