解析文件时如何找到完成百分比?

时间:2013-04-18 17:12:44

标签: ruby

如何打印已解析的文件的百分比。我正在解析一个文本文件,所以我使用:

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"

4 个答案:

答案 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)

无需事先加载文件,您可以使用sizepos方法:

f = open('myfile')
while (line = f.gets)
  puts "#{(f.pos*100)/f.size}%\t#{line}"
end

减少行数,减少逻辑,精确到字节。

答案 3 :(得分:0)

我建议使用read逐行读取文件作为流,而不是读取整个文件并将其加载到内存中(与readlinesFile.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