读取文本文件并在Ruby中写入另一个文本文件

时间:2011-09-07 18:23:02

标签: ruby parsing

我想要一个文本文件,foo.txt,它是一个10位数的列表,每个都在各自的行上。如果数字符合某组参数,我希望该行写入bar.txt。

在Ruby中直接执行此操作的简单方法是什么?我刚接触Ruby中的文件解析,只需要一些帮助就可以开始了。

2 个答案:

答案 0 :(得分:2)

对不起,我无法抗拒高尔夫码。

给定文件foo.txt,如下所示:

3588888932
4783748387
3434934343
4344232322
4343343439
1111132333

你可以读取这个文件并输出到标准输出所有包含数字9的行,并带有以下命令行咒语:

$ ruby -e 'ARGF.each {|line| puts line if line =~ /9/}' < foo.txt

此输出

3588888932
3434934343
4343343439

当然,如果您需要写入其他文件,可以说

$ ruby -e 'ARGF.each {|line| puts line if line =~ /9/}' < foo.txt > bar.txt

通常,从文件中过滤行是最好通过标准输入完成的(这里我使用ARGF),但当然也可以使用Ruby的文件方法,以防这个任务需要作为更大的Ruby应用程序的一部分执行。

这里常见的方法是

File.open("foo.txt", "r") do |f|
    while (line = f.gets)
        puts line if line =~ /9/
    end
end

这会写入标准输出,因此要写入bar.txt您可以重定向。这里关于Ruby的一个好处是文件,因为它是一个块参数,当块退出时会自动关闭。

您也可以通过在一个块中打开文件来写入文件。要从foo.txt中读取并写入bar.txt,请参阅Paul的回答。

答案 1 :(得分:2)

在应用中你可以这样做:

File.open("output.txt", "w") do |out|
  IO.readlines("input.txt").each do |line|
     if (line =~ /^1/)
          out.puts(line)
     end
  end
end

如果要像输出那样打开输入,可以使用“r”而不是“w”。

readlines方法将立即读入整个文件,因此对于大文件来说,这不是最好的想法,但对于小文件来说,这不是什么大问题而且很容易。请注意块如何处理为您关闭句柄。