在Ruby中打开文件

时间:2016-10-06 20:56:04

标签: ruby syntax

代码示例1:

$body = Get-ChildItem -Literal $path -Recurse -File -Include *.xlsx, *.docx, *.txt, *.csv |
        ForEach {
            $fPath = $_.FullName.Substring($path.Length + 1)
            "<a href=""$fPath"">$fPath</a><br>" 
        }
$html = ConvertTo-Html -Head $head -Body $body | Out-String

代码示例2:

def count_lines1(file_name)
  open(file_name) do |file|
    count = 0
    while file.gets
      count += 1
    end
    count
  end
end

我想知道哪个是实现文件中行计数的更好方法。就Ruby中的良好语法而言。

1 个答案:

答案 0 :(得分:2)

  

这是实现文件中行计数的更好方法。

都不是。 Ruby可以使用foreach

轻松完成
def count_lines(file_name)
  lines = 0
  File.foreach(file_name) { lines += 1 }
  lines
end

如果我针对我的〜/ .bashrc运行:

$ ruby test.rb
37

foreach速度非常快,可以避免可扩展性问题。

或者,您可以利用操作系统中的工具,例如wc -l专门为该任务编写的工具:

`wc -l .bashrc`.to_i

将再次返回37。如果文件很大,wc可能无法在Ruby中执行,因为wc是用编译代码编写的。

  

您还可以读取带有读取和计数换行符的大块。

是的,read将允许您这样做,但可扩展性问题仍将存在。在我的环境中,readreadlines可能是一个脚本杀手,因为我们经常需要将文件处理成数十GB。有足够的RAM来保存数据,但I / O因为压缩数据的开销而受到影响。 &#34; Why is "slurping" a file not a good practice?&#34;进入这个。

另一种大块读取方法是告诉Ruby读取设置块大小,计算该块中的行尾,循环直到完全读取文件。我没有在上面的链接答案中测试该方法,但是在我用Perl编写时,过去做过类似的事情,发现差异并没有真正改善,因为它导致了更多的代码。那时,如果我所做的只是计算行数,那么调用wc -l更有意义并让它完成工作,因为它对编码时间来说要快得多,而且很可能在执行时间。