如何打印已解析的文件的百分比。我正在解析一个文本文件,所以我使用:
file.each_line do
是否有类似each_with_index
的方法可用于字符串?
这就是我目前使用each_with_index
查找完成百分比的方式:
amount = 10000000
file.each_with_index do |line, index|
if index == amount
break
end
print "%.1f%% done" % (index/(amount * 1.0) * 100)
print "\r"
答案 0 :(得分:3)
预先获取所有行,然后在执行所需的任何操作时显示进度。
lines = file.readlines
amount = lines.length
lines.each_with_index do |line, index|
if index == amount
break
end
print "%.1f%% done" % (index/(amount * 1.0) * 100)
print "\r"
end
答案 1 :(得分:3)
要获得行数,您可以做几件不同的事情。
如果您使用的是Linux或Mac OS,请利用底层操作系统并询问文件中有多少行:
lines_in_file = `wc -l #{ path_to_file_to_read }`
wc
非常快,可以告诉你线条,单词和字符。 -l
指定行。
如果您想在Ruby中执行此操作,可以使用File.readlines('/path/to/file/to/read')
或File.read('/path/to/file/to/read').lines
,但要非常小心。两者都会将整个文件读入内存,并且,如果该文件大于您的可用内存,那么您只是将您的机器打得慢慢死亡。所以,不要这样做。
而是使用类似的东西:
lines_in_file = 0
File.foreach('/path/to/file/to/read') { lines_in_file += 1 }
运行后,lines_in_file
将保留文件中的行数。 File.foreach
非常快,非常等于使用File.readlines
,可能比File.read().lines
更快,并且它一次只读取一行,因此您不会填充RAM。
如果您想知道刚从文件中读取的行的当前行号,可以使用Ruby的$.
。
但你担心“文件的百分比”。这个问题的一个潜在问题是线条长度可变。根据您对它们的处理方式,线路长度可能会对您的进度表产生很大影响。您可能希望查看文件的实际长度,并通过读取每一行来跟踪消耗的字符数,因此您的进度基于字符的百分比,而不是行的百分比。
答案 2 :(得分:1)
无需事先加载文件,您可以使用size
和pos
方法:
f = open('myfile')
while (line = f.gets)
puts "#{(f.pos*100)/f.size}%\t#{line}"
end
减少行数,减少逻辑,精确到字节。
答案 3 :(得分:0)
我建议使用read
逐行读取文件作为流,而不是读取整个文件并将其加载到内存中(与readlines
或File.foreach
一样)。
count = 0
File.foreach('your_file') { count += 1 }
idx = 0
File.foreach('your_file') do |line|
puts "#{(idx+1).to_f / count * 100}%"
idx += 1
end