首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在ruby on rails中通过循环读取多个文本文件

无法在ruby on rails中通过循环读取多个文本文件
EN

Stack Overflow用户
提问于 2013-09-04 13:13:58
回答 2查看 142关注 0票数 0

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

代码语言:javascript
复制
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“是文本的第二行。

代码语言:javascript
复制
<% @params.each do |pro| %>
 <%= pro %>
<% end %>

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

EN

回答 2

Stack Overflow用户

发布于 2013-09-04 13:27:24

尝试更改此行

代码语言:javascript
复制
@params = data[1]

代码语言:javascript
复制
@params << data[1]

或者更好地重构代码,比如

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2013-09-04 14:07:51

问题出在:

代码语言:javascript
复制
@params = data[1]

您将使用单个字符串值覆盖它,而不是将其作为数组。这就是为什么没有each方法的原因。

我会像这样写代码:

代码语言:javascript
复制
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,它几乎同样快,并且不容易受到相同的内存限制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18605848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档