Node.js readline 缺少文件的最后一行?
Posted
技术标签:
【中文标题】Node.js readline 缺少文件的最后一行?【英文标题】:Node.js readline missing last line of file? 【发布时间】:2013-08-29 07:13:33 【问题描述】:我正在尝试在 Node.js 下异步逐行读取文本文件。我有以下 CoffeeScript 代码:
readline = require 'readline'
fs = require 'fs'
#--------------------------------------------------------------------
lines_of = ( route, handler ) ->
#..................................................................
stream = readline.createInterface
input: fs.createReadStream route
output: process.stdout
terminal: false
#..................................................................
stream.on 'close', ->
handler null, null
#..................................................................
stream.on 'error', ( error ) ->
handler error
#..................................................................
stream.on 'line', ( line ) ->
handler null, line
它工作正常,除了最后一行文件不会被报告,除非它被换行符终止。有什么办法可以解决这个问题(当然,除了手动添加换行符)?
【问题讨论】:
简单的解决方案,如果文件不是太大:也许只使用readFile
并在\n
上拆分?
是的,这绝对不是 readline 的用途。如果您正在制作 shell 或 REPL,您将使用 readline,而不是用于读取文件。你想要fs
模块:nodejs.org/api/fs.html
你的评论让我觉得既正确又在技术上存在争议——毕竟,“黑客”就是在适当的地方使用工具。更重要的是:流抽象告诉您查看的不是那么多文件、http 请求和标准输入键盘事件,而是“数据流”。也就是说,如果 readline 没有办法传达“悬空位”(在换行之前,但在输入流完成之后),那么它是它的 API,而不是它的 预期目的 这使得这个库不适合手头的任务。
@WiredPrairie:是的,这对于小文件来说是一个很好的解决方案,但我需要读取数万行的文件。处理逻辑和处理速度都受益于异步方式。
所以,答案是“不”,没有办法使用您选择的 API 来解决这个问题。您需要找到另一个模块或编写进行逐行处理所需的几行代码。
【参考方案1】:
您应该为此使用fs
模块,并在\n
字符上拆分文件内容以确定行结束的位置。
【讨论】:
读取文件内容?如果文件大小是 50G 而你的 RAM 是 4G 怎么办?【参考方案2】:似乎从 0.12.2 https://github.com/nodejs/node-v0.x-archive/issues/7238 开始修复
【讨论】:
以上是关于Node.js readline 缺少文件的最后一行?的主要内容,如果未能解决你的问题,请参考以下文章
在关闭事件时从 node.js readline 模块返回数组
Node.JS 文件读写,把Sheet图集转换为龙骨动画图集