将文件读入数组,不包括注释掉的行

时间:2013-02-24 20:35:24

标签: ruby file-io puppet

我几乎是一个Ruby-nOOb(只有Ruby的知识才能编写一些基本的.erb模板或Puppet自定义事实)。看起来我的要求相当简单,但无法理解它。

尝试编写.erb模板,在该模板中,它将数据(带空格分隔的行)读取到数组,然后根据要求处理每个数组元素。这是我到目前为止所得到的:

fname = "webURI.txt"

def myArray()
    #if defined? $fname
    if File.exist?($fname) and File.file?($fname)
        IO.readlines($fname)
    end
end

myArray.each_index do |i|
    myLine = myArray[i].split(' ')
    puts myLine[0] +"\t=> "+ myLine.last
end

除了(明显的原因)被注释掉的行或空行之外,哪个工作正常。我还想确保当吐出(通过空间)时,该线不应该有两个以上的区域;像这样的文件:

# This is a COMMENT
#
# Puppet dashboard
puppet controller-all-local.example.co.uk:80

# Nagios monitoring
nagios controller-all-local.example.co.uk::80/nagios
tac talend-tac-local.example.co.uk:8080/org.talend.admin

mng console talend-mca-local.example.co.uk:8080/amc     # Line with three fields

所以,基本上这两件事我想实现:

  1. 将行读入数组,在第一个#
  2. 之后删除所有内容
  3. 拆分每个元素,如果数字ID超过两个,则打印一条消息
  4. 非常感谢任何帮助。干杯!!

    <小时/> 更新 25/02

    感谢你的帮助!!

    blank这件事根本不起作用;抛出这个错误;但我有点不明白为什么:

      

    未定义的方法`空白?&#39; for&#34; \ n&#34;:String(NoMethodError)

    数组:myArray,我得到的实际上是这样的(使用p代替puts

    ["\n", "puppet controller-all-local.example.co.uk:80\n", "\n", "\n", "nagios controller-all-local.example.co.uk::80/nagios\n", .....     \n"]
    

    因此,我必须这样做以解决这个问题:

    $fname = "webURI.txt"
    
    def myArray()
        if File.exist?($fname) and File.file?($fname)
            IO.readlines($fname).map { |arr| arr.gsub(/#.*/,'') }
        end
    end
    
    # remove blank lines
    SSS = myArray.reject { |ln| ln.start_with?("\n") }
    
    SSS.each_index do |i|
        myLine = SSS[i].split(' ')
    
        if myLine.length > 2
            puts "Too many arguments!!!"
    
        elsif myLine.length == 1
            puts "page"+ i.to_s + "\t=> " + myLine[0]
    
        else
            puts myLine[0] +"\t=> "+ myLine.last
        end
    end
    

    欢迎您改进代码。欢呼声!!

1 个答案:

答案 0 :(得分:1)

goodArray = myArray.reject do |line|
  line.start_with?('#') || line.split(' ').length > 2
end

这会拒绝以#开头的任何内容,或者split会返回一个包含两个以上元素的数组,返回一个只包含好项的数组。

修改

对于您的内联评论,您可以执行

goodArray.map do |line|
  line.gsub(/#.*/, '')
end