如何使用node.js从.list文件中提取数据

时间:2014-03-20 12:57:15

标签: javascript node.js csv

我有一个.list文件,其中包含有关电影的信息。该文件格式如下

New  Distribution  Votes  Rank  Title
      0000000125  1176527   9.2  The Shawshank Redemption (1994)
      0000000125  817264   9.2  The Godfather (1972)
      0000000124  538216   9.0  The Godfather: Part II (1974)
      0000000124  1142277   8.9  The Dark Knight (2008)
      0000000124  906356   8.9  Pulp Fiction (1994)

我到目前为止的代码如下:

//modules ill be using
var fs = require('fs');
var csv = require('csv');

csv().from.path('files/info.txt', { delimiter: '  '})
.to.array(function(data){
    console.log(data);
});

但是因为值是由单个空格分隔的,所以是双空格和制表符。没有单独的分隔符可供使用。如何将此信息提取到数组中?

2 个答案:

答案 0 :(得分:3)

您可以将多个空格缩小到一个空格,然后您可以将其读作字符串;

fs = require('fs')
fs.readFile('files/info.txt', 'utf8', function (err, csvdata) {
  if (err) {
    return console.log(err);
  }
  var movies = csvdata.replace(/\s+/g, "\t");

  csv().from.string(moviews, { delimiter: '\t'})
    .to.array(function(data){
        console.log(data);
    });

});

答案 1 :(得分:0)

使用正则表达式解析起来很容易:

function parse(row) {
  var match = row.match(/\s{6}(\d*)\s{2}(\d*)\s{3}(\d*\.\d)/)
  return {
    distribution: match[1],
    votes: match[2],
    rank: match[3]
  };
}

fs.readFileSync(file)
  .split('\n')
  .slice(1) //since we don't care about the first row
  .map(parse);

我会让你继续建立其余的正则表达式。我使用两个工具来执行此操作:rubular.com和node.js repl。

\s{6}(\d*)\s{2}(\d*)表示:MATCH 6 SPACE,然后捕获任意数量的数字,然后匹配2个空格,然后捕获另一个任意数量的数字等。