我正在尝试一次读取多个文本文件。第一行是文本文件之间的区别,而文本文件名是相同的。我使用以下代码,只能读取一个文本文件,但不能读取整个文本。请帮帮我。 这是我的控制器代码
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”:String 其中“ARUBA-I8262-SLIM-03 \ n是第2行文字。
<% @params.each do |pro| %>
<%= pro %>
<% end %>
这里我只从一个文本文件中获取数据
答案 0 :(得分:0)
尝试更改此行
@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
答案 1 :(得分:0)
问题在于:
@params = data[1]
您使用单个String值覆盖它而不是数组。这就是没有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
读取整个文件,它会立即将所有文件读入内存。这被称为“啜饮”并不是一个好习惯,除非你绝对确定文件永远不会超过可用内存。相反,执行线路I / O,这几乎同样快,并且不容易受到相同的内存限制。