如何在node.js中解析大型TSV文件?

Roux

我对Node和JS非常陌生。我有一个较大的TSV文件(1.5gb),需要读入并解析为数组或JSON对象。我将如何去做?当我尝试下面的代码时,我没有收到错误,但它甚至没有输入。

var d3 = require("d3-dsv");

d3.tsvParse("amazon_reviews_us_Mobile_Apps_v1_00.tsv", function(error, data) 
{
    var sum = 0;
    data.forEach(function(d) 
    {
        d.helpful_votes += d.helpful_votes;
        sum += d.helpful_votes;
    });
    console.log("Total Helpful Votes: " + sum);
});

任何帮助,将不胜感激。

MichałKapracki

您需要找到一个为TSV文件提供流解析器的模块,这意味着它不会将整个文件加载到内存中。如果解析器是同步的,则可以使用readline:

const {createInterface} = require("rl");
const {createReadStream} = require("fs");

createInterface({input: createReadStream("amazon_reviews_us_Mobile_Apps_v1_00.tsv")})
   .on('line', (data) => doSomethingWith(data.split("\t")))
   .on('end', () => doSomethingWhenDone())

您写道要解析该文件并将其更改为某种数组或对象。您仍然需要查看自己的内存,但是您可以使用my scramjet,它可以让您随意转换数据:

const {StringStream} = require("scramjet");
const {createReadStream, createWriteStream} = require("fs");

StringStream.from(createReadStream("amazon_reviews_us_Mobile_Apps_v1_00.tsv"))
    // read the file
    .CSVParse({delimiter: "\t"})
    // parse as csv
    .map((entry) => doSomething(entry))
        // whatever you return here it will be changed
        // this can be asynchronous too, so you can do requests...
    .toJSONArray()
    .pipe(createWriteStream("somefile.json"))

让我知道您除了计数之外还想达到什么目的。我将编辑答案。

顺便说一句,仅凭票数,@ hugo-elhaj-lahsen的解决方案也不错,我不确定为什么它被否决了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章