我想要一个文本文件,foo.txt,它是一个10位数的列表,每个都在各自的行上。如果数字符合某组参数,我希望该行写入bar.txt。
在Ruby中直接执行此操作的简单方法是什么?我刚接触Ruby中的文件解析,只需要一些帮助就可以开始了。
答案 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方法将立即读入整个文件,因此对于大文件来说,这不是最好的想法,但对于小文件来说,这不是什么大问题而且很容易。请注意块如何处理为您关闭句柄。