2013-02-24 66 views
2

我几乎是一个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. 分割的两个元素剥离一切并打印一条消息,如果数字ID超过两个

任何帮助将不胜感激。干杯!!


更新 25/02

感谢家伙对你有所帮助!

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

undefined method'blank?'为 “\ n” 个:字符串(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
goodArray = myArray.reject do |line| 
    line.start_with?('#') || line.split(' ').length > 2 
end 

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

编辑:

为了您的在线评论,那么你可以做

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

您可能要添加一个'.reject(空白?)'太删除空行。 – gmaliar 2013-02-24 21:02:24

+0

谢谢你!另外,我怎么剥离第一个'#'中的每一件东西来处理在线注释'(例如,Abc Bcd#in-line comment)'?干杯!! – MacUsers 2013-02-24 21:11:15

+0

编辑我的答案。 – gmaliar 2013-02-24 21:18:43