[英]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.