我正在编写一种拆分文本文件的方法。它有两个选择,
保存行的代码如下:
file.rewind # `file` is a File object with proper modes passed
lines = file.each_line
until file.eof?
tfile.truncate(0) # `tfile` is a temporary File object which will be given to the block passed
while tfile.size + lines.peek.size <= size
tfile << lines.next
tfile.flush
end
file_count += 1
yield(tfile, file_count)
end
现在的问题是,如果最后一个拆分中仅保留一行,则该迭代将不会运行,因为peek
在最后一个迭代中将光标移动到文件末尾,因此条件是unless
的最后一次迭代产生一个true
的值,然后退出循环。
如何解决将光标移到 eof 的问题?
我正在考虑将光标移到每next
前一行。如果有更好的选择,请提出建议。
答案 0 :(得分:1)
Enumerator#peek
不会向前移动Enumerator
的内部位置。但是,如果位置已经在末尾,则StopIteration
会升高。问题是您根本不需要peek
。
那将是解决问题的正确方法(该代码未经测试,但应该可以工作):
file.rewind
tfile.truncate(0)
total_files =
file.each_line.with_object(file_count: 0) do |line, acc|
if tfile.size + line.size <= size
tfile << line
tfile.flush
else
acc[:file_count] += 1
yield(tfile, acc[:file_count])
tfile.truncate(0)
tfile << line
tfile.flush
end
end[:file_count]
yield(tfile, total_count)