簡體   English   中英

我將如何解析 node.js 中的大型 TSV 文件?

[英]How would I parse a large TSV file in node.js?

我對 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);
});

任何幫助,將不勝感激。

您需要找到一個為 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())

您寫道,您想解析該文件並將其更改為某種數組或對象。 您仍然需要查看您的內存,但您可以使用我的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 的解決方案只是計算選票也很好,我不確定為什么它被否決了。

d3.tsv與基於d3.tsv的 API 一起使用。 由於您的文件非常大,我們可以做的一種優化是在 D3 解析每個元素后,不要對每個元素執行 for-each,而是使用在解析時通過初始化函數完成的循環

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

var sum = 0

d3.tsvParse("amazon_reviews_us_Mobile_Apps_v1_00.tsv", data => {
  sum += d.helpful_votes;
  return d // Since this is the parser, need to return the parsed object at the end
}).then(data => {
  console.log("Total helpful votes", sum)
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM