我需要使用Ruby来遍历目录并在特定类型的文件中查找文本。
例如,我的文件夹包含以下文件: a.txt,b.txt,c.trr,d.trr 我希望我的代码仅检查 c.trr 和 d.trr 文件,并查找其中之一是否包含字符串“ aaa”。
我尝试了一些选择,但似乎没有一个适合我。
我尝试过:
Dir.foreach("/myusername/Desktop/a") do |fname|
if (File.extname(fname) == ".trr")
begin
fname.each_line do |line|
if
line.scan(Regexp.new('aaa'))
puts "found it!"
else
puts "no can do sir"
end
end
rescue Exception => ex
puts ex
end
end
end
没用。
当我尝试打印line
变量时,得到的是文件名而不是其中的行。
我试图将scan
函数更改为match
,并且我也试图
将Regexp.new('aaa')
更改为\aaa\
。
它们似乎都不起作用。
Dir.foreach
是否还会打开文件?如果不是,如何打开它?
我尝试使用File.open(fname)
,但遇到以下异常:
没有这样的文件或目录@ rb_sysopen
答案 0 :(得分:1)
通常,Dir
方法将仅返回文件名。您仍然需要手动打开和读取文件。
Dir["*.trr"].each do |fname|
content = File.read(fname)
if content =~ /aaa/
puts "found it in: #{fname}"
else
puts "not found in: #{fname}"
end
end
您可以使用Dir#[]
并传递匹配的字符串,而不是使用foreach
。然后,只需将文件内容与所需内容进行比较即可。
答案 1 :(得分:0)
上面的答案很好,但是您可以通过创建包含正则表达式但不匹配正则表达式的数组来进一步使用Ruby的Enumerable处理:
with_aaa, without_aaa = Dir["*.trr"].partition do |filename|
File.read(filename) =~ /aaa/
end
...或者,如果您不在乎与正则表达式匹配的 ,则可以使用select
代替partition
:
with_aaa = Dir["*.trr"].select do |filename|
File.read(filename) =~ /aaa/
end