0

我正在尝试一次读取多个文本文件。其中第一行在文本文件之间产生差异,而文本文件名称相同。我正在使用以下代码,它只能读取一个文本文件,但不能读取整个文件。请帮帮我。这是我的控制器代码

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”显示未定义的方法“每个”:字符串,其中“ARUBA-I8262-SLIM-03\n”是文本的第二行。

<% @params.each do |pro| %>
 <%= pro %>
<% end %>

在这里我只从一个文本文件中获取数据

4

2 回答 2

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
于 2013-09-04T05:27:23.633 回答
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.chdirwith 块将更改到指定目录,然后在块退出时弹出原始目录。

Dir.glob返回一个数组,因此在 Ruby 中迭代该数组是惯用的,而不是尝试对其进行索引并循环遍历该数组。原因有很多,但归结为减少错误。

fi.gets从输入文件中读取一行。没有理由读取整个 using readlines,它一次将所有文件读入内存。这称为“slurping”,除非您绝对确定文件永远不会超过可用内存,否则这不是一个好习惯。相反,执行线路 I/O,它几乎一样快,并且不容易受到相同的内存限制。

于 2013-09-04T06:07:50.707 回答