gpt4 book ai didi

node.js - 使用 Node.js 和 CoffeeScript 遍历文件中的行

转载 作者:搜寻专家 更新时间:2023-10-31 22:42:40 25 4
gpt4 key购买 nike

我正在使用带有 CoffeScript 的 Node.js 遍历文件中的行,以下功能:

each_line_in = (stream, func) ->
fs.stat stream.path, (err, stats) ->
previous = []
stream.on 'data', (d) ->
start = cur = 0
for c in d
cur++
if c == 10
previous.push(d.slice(start, cur))
func previous.join('')
previous = []
start = cur
previous.push(d.slice(start, cur)) if start != cur

有没有更好的方法不用读入整个文件内存? 我所说的“更好”是指更简洁,内置于 Node.js 中,更快,或者更正确。如果我正在编写 Python,我会这样做:

def each_line_in(file_obj, func):
[ func(l) for l in file_obj ]

我看到了thisquestion使用 Peteris Krumin's "lazy"module ,但我想完成这没有添加外部依赖项。

最佳答案

这是一个相当有效的方法:

eachLineIn = (filePath, func) ->

blockSize = 4096
buffer = new Buffer(blockSize)
fd = fs.openSync filePath, 'r'
lastLine = ''

callback = (err, bytesRead) ->
throw err if err
if bytesRead is blockSize
fs.read fd, buffer, 0, blockSize, null, callback

lines = buffer.toString('utf8', 0, bytesRead).split '\n'
lines[0] = lastLine + lines[0]
[completeLines..., lastLine] = lines
func(line) for line in completeLines
return

fs.read fd, buffer, 0, blockSize, 0, callback
return

您应该在您的硬件和操作系统上对此进行基准测试,以找到适用于大文件的 blockSize 的最佳值。

请注意,这假设文件行仅由 \n 分隔。如果您不确定您的文件使用什么,您应该使用正则表达式进行 split,例如:

.split(/(\\r\\n)|\\r|\\n/)

关于node.js - 使用 Node.js 和 CoffeeScript 遍历文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6319190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com