在node.js中一次读取一行文件?
|
我正在尝试一次读取一行大文件。我在Quora上发现了一个与该主题有关的问题,但我缺少一些联系以使整个组件组合在一起。
var Lazy=require(\"lazy\");
new Lazy(process.stdin)
.lines
.forEach(
function(line) {
console.log(line.toString());
}
);
process.stdin.resume();
我想弄清楚的一点是,如何一次从文件而不是如本示例中的STDIN读取一行。
我试过了:
fs.open(\'./VeryBigFile.csv\', \'r\', \'0666\', Process);
function Process(err, fd) {
if (err) throw err;
// DO lazy read
}
但它不起作用。我知道,在紧急情况下,我可能会回过头来使用PHP之类的东西,但是我想弄清楚这一点。
我认为其他答案不会起作用,因为该文件比我正在运行该文件的服务器要大得多。
没有找到相关结果
已邀请:
27 个回复
蔬谢窗港
即使没有最后的“ 3”,也可以正确读取最后一行(从Node v0.12或更高版本开始)。 更新:此示例已添加到Node \'s API官方文档中。
扭湘阀柿蹄
博沮富教全
文件,而是必须创建a6ѭ文件。
然后将该流传递给
郸身
如果您需要更多控制,甚至可以使用“ java样式”接口来迭代文件:
粱委教
凸晴
简单。无需外部模块。
坊岔埠绵
在处理需要在日志解析期间累积数据的快速日志解析脚本时,我确实想到了这一点,并且我认为尝试使用js和node而不是使用perl或bash来进行此操作会很不错。 无论如何,我的确感到小型的nodejs脚本应该是自包含的,而不是依赖于第三方模块,因此在阅读了该问题的所有答案之后,每个脚本都使用各种模块来处理行解析,因此可能有兴趣使用13 SLOC本机nodejs解决方案。
款去芳尾脊
靛新比比催
掀辟髓观粟
擅香
藕挝
尚未对大型文件进行测试。让我们知道您是否愿意。
戊袱
粱委教
可扇胆
拟僚疽刊剔
我的用例只是一个独立的脚本,而不是服务器,因此同步很好。这些是我的标准: 可以在许多项目中重用的最小同步代码。 文件大小或行数没有限制。 线长没有限制。 能够处理UTF-8中的完整Unicode,包括BMP以外的字符。 能够处理* nix和Windows的行尾(我不需要旧式Mac)。 行中要包含的行尾字符。 能够处理带有或不带有行尾字符的最后一行。 不要使用未包含在node.js发行版中的任何外部库。 对我来说,这是一个项目,目的是感受一下node.js中的低级脚本类型代码,并确定它作为替代其他脚本语言(如Perl)的可行性。 经过令人惊讶的努力和几次错误的开始,这就是我想出的代码。它非常快,但比我预期的要简单:(在GitHub上分叉)
可能会进一步清除它,这是反复试验的结果。
翰冒绢县
授巨
镰茧钩
我有同样的问题,并提出了上述解决方案 看起来与其他人相似,但是是aSync,可以非常快速地读取大文件 希望这会有所帮助
缕嚏冻
薄响
上面的代码基于以下示例:https://github.com/amaksr/nsynjs/blob/master/examples/node-readline/index.js
墩瓣茅械
在流上使用此函数并侦听将要发出的行事件。 gr-
掀辟髓观粟
模块作为最佳答案,但
似乎是面向命令行界面而不是行读取。在缓冲方面也有些不透明。 (任何需要面向流线的阅读器的人都可能希望调整缓冲区大小)。 readline模块为〜1000行,而带有统计和测试的行为34。
这是一个更短的版本,没有统计信息,共有19行:
朗排谎纷瘟
闪票仇门韧
峨躬坎抬焚
阀傻
现在,从大文件读取特定行的最佳方法是使用节点的读取行。该文档有一个惊人的示例。 尽管我们不需要任何第三方模块。但是,如果您正在编写企业代码,则必须处理很多边缘情况。我必须编写一个名为Apick File Storage的非常轻巧的模块来处理所有这些极端情况。 Apick文件存储模块:https://www.npmjs.com/package/apickfs 文档:https://github.com/apickjs/apickFS#readme 示例文件:https://1drv.ms/t/s!AtkMCsWInsSZiGptXYAFjalXOpUx 范例: 安装模块
此方法已成功测试多达4 GB的密集文件。 big.text是具有163,845行的密集文本文件,大小为124 Mb。从该文件读取10行不同的脚本仅使用大约4.63 MB内存。并且它免费将有效的JSON解析为对象或数组。