2

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

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

4 回答 4

4

要获得行数,您可以做一些不同的事情。

如果您使用的是 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,但要非常小心。两者都会将整个文件读入内存,并且,如果该文件大于您的可用 RAM,那么您只是将您的机器打得慢死。所以,不要那样做。

而是使用类似的东西:

lines_in_file = 0
File.foreach('/path/to/file/to/read') { lines_in_file += 1 }

运行后,lines_in_file会保存文件中的行数。File.foreach非常快,几乎等于 usingFile.readlines并且可能比 快File.read().lines,而且它一次只读取一行,所以你不会填满你的 RAM。

如果您想知道刚从文件中读取的行的当前行号,可以使用 Ruby 的$..

不过,您担心“文件的百分比”。一个潜在的问题是行是可变长度的。根据您对它们所做的事情,行长可能会对您的进度条产生很大影响。您可能希望查看文件的实际长度并跟踪读取每行所消耗的字符数,因此您的进度基于字符的百分比,而不是行的百分比。

于 2013-04-18T18:45:02.130 回答
3

Get all the lines upfront, then display the progress as you perform whatever operation you need on them.

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
于 2013-04-18T17:34:24.973 回答
1

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

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

更少的行,更少的逻辑和精确到一个字节。

于 2013-04-18T19:56:30.977 回答
0

Rather than reading the whole file and loading it in memory (as with read or readlines), I suggest to use File.foreach reading the file as a stream, line by line.

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
于 2013-04-18T17:26:56.183 回答