1

所以我正在解析一个大的 csv 文件并将结果推送到 mongo 中。

该文件是maxminds 城市数据库。它有各种有趣的 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,加拿大

编辑

我尝试使用不同的库来读取文件:

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","Capellan�a","",8.3000,-80.5500,, 154220,"AR","01","Villa Espa�a"," ",-34.7667,-58.2000,,

4

1 回答 1

4

原来 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
于 2013-05-31T22:26:00.643 回答