无法通过rails上的ruby中的循环读取多个文本文件

时间:2013-09-04 05:13:58

标签: ruby-on-rails ruby

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

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 %>

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

2 个答案:

答案 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,这几乎同样快,并且不容易受到相同的内存限制。