栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Node.js中解析大型JSON文件

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Node.js中解析大型JSON文件

要逐行处理文件,只需要将文件的读取与作用于该输入的代码分离开。您可以通过缓冲输入直到碰到换行符来完成此操作。假设每行有一个JSON对象(基本上是格式B):

var stream = fs.createReadStream(filePath, {flags: 'r', encoding: 'utf-8'});var buf = '';stream.on('data', function(d) {    buf += d.toString(); // when data is read, stash it in a string buffer    pump(); // then process the buffer});function pump() {    var pos;    while ((pos = buf.indexOf('n')) >= 0) { // keep going while there's a newline somewhere in the buffer        if (pos == 0) { // if there's more than one newline in a row, the buffer will now start with a newline buf = buf.slice(1); // discard it continue; // so that the next iteration will start with data        }        processLine(buf.slice(0,pos)); // hand off the line        buf = buf.slice(pos+1); // and slice the processed data off the buffer    }}function processLine(line) { // here's where we do something with a line    if (line[line.length-1] == 'r') line=line.substr(0,line.length-1); // discard CR (0x0D)    if (line.length > 0) { // ignore empty lines        var obj = JSON.parse(line); // parse the JSON        console.log(obj); // do something with the data here!    }}

每次文件流从文件系统接收数据时,它都会存储在缓冲区中,然后

pump
被调用。

如果缓冲区中没有换行符,

pump
则不执行任何操作即可返回。下次流获取数据时,会将更多数据(可能还有换行符)添加到缓冲区中,然后我们将拥有一个完整的对象。

如果有换行符,请

pump
从开始处将缓冲区切到换行符,然后将其移交给
process
。然后,它再次检查缓冲区中是否还有换行符(
while
循环)。这样,我们可以处理在当前块中读取的所有行。

最后,

process
每条输入线被调用一次。如果存在,它将去除回车符(以避免出现行尾问题– LF vs
CRLF),然后将
JSON.parse
其中之一称为行。此时,您可以对对象执行任何所需的操作。

注意,

JSON.parse
它接受什么作为输入是严格的。您必须 用双引号 将标识符和字符串值引起
。换句话说,
{name:'thing1'}
会抛出错误;您必须使用
{"name":"thing1"}

因为一次最多只能有一块数据存储在内存中,所以这将极大地提高存储效率。这也将非常快。快速测试显示,我在15毫秒内处理了10,000行。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/575235.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号