我正在尝试一次读取多个文本文件。其中第一行是文本文件之间的区别,而文本文件名称是相同的。我正在使用下面的代码,它只能读取一个文本文件,而不能读取整个文件。请帮帮我。下面是我的控制器代码
def index
Dir.chdir("/home/sbrc/sukanta/opengrok")
@f = Dir.glob("**/*.txt")
i = 0
@params = []
while i<@f.length
data = IO.readlines("/home/sbrc/sukanta/opengrok/"+@f[i])
if data[0] == "JBP PROD\n"
#@project = data[1]
# @cl = data[4]
@params = data[1]
end
i+=1
end
end我的视图文件代码是"ARUBA-I8262-SLIM-03\n“的未定义方法‘`each’:字符串,其中”ARUBA-I8262-SLIM-03\n“是文本的第二行。
<% @params.each do |pro| %>
<%= pro %>
<% end %>在这里,我只从一个文本文件获取数据
发布于 2013-09-04 13:27:24
尝试更改此行
@params = data[1]至
@params << data[1]或者更好地重构代码,比如
def index
@params = []
Dir.glob("/home/sbrc/sukanta/opengrok/*.txt") do |file|
data = IO.readlines(file)
@params << [data[1], data[4]].join('@') if data[0] == "JBP PROD\n"
end
end发布于 2013-09-04 14:07:51
问题出在:
@params = data[1]您将使用单个字符串值覆盖它,而不是将其作为数组。这就是为什么没有each方法的原因。
我会像这样写代码:
def index
@params = []
Dir.chdir("/some/path/to/files") do
Dir.glob("**/*.txt").each do |text_file|
File.open(text_file, 'r') do |fi|
line1 = fi.gets
line2 = fi.gets
@params << line2.chomp if ((line1.chomp == 'JBP PROD') && line2)
end
end
end
end带有块的Dir.chdir将切换到指定的目录,然后在块退出时弹出原始目录。
Dir.glob返回一个数组,所以在Ruby语言中惯用的做法是遍历该数组,而不是尝试索引该数组并遍历该数组。原因有很多,但归根结底是减少了错误。
fi.gets从输入文件中读取一行。没有理由使用readlines读取整个文件,它会一次将所有文件读取到内存中。这被称为"slurping“,除非您绝对确定文件永远不会超出可用内存,否则这不是一种好的做法。相反,执行行I/O,它几乎同样快,并且不容易受到相同的内存限制。
https://stackoverflow.com/questions/18605848
复制相似问题