2013-02-24 5 views
2

Я почти рубиновый 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 

Который работает просто отлично, за исключением (по понятным причинам) для линии, которая закомментированная или пустых строк. Я также хочу удостовериться, что когда spitted (по пространству) вверх, линия не должна содержать более двух полей; файл, как это:

# 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. Сплит каждый элемент и распечатать сообщение, если идентификатор номера более двух

Любая помощь была бы принята с благодарностью. Ура !!


Update 25/02

Спасибо парень за вашу помощь !!

blank вещь вообще не работает; бросая эту ошибку; но я почему-то не понял, почему:

неопределенный метод `blank? ' для "\ п": 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
goodArray = myArray.reject do |line| 
    line.start_with?('#') || line.split(' ').length > 2 
end 

Это отклоняло бы все, что начинается с #, или split возвращает массив из более чем двух элементов, возвращая вам массив только хороших элементов.

Edit:

Для вашего инлайн комментирования, то вы можете сделать

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

Вы можете добавить '.reject (& пустой?)', Чтобы удалить пустые строки тоже. – gmaliar

+0

Спасибо, парень!Кроме того, как я могу удалить все вещи из первого '#' для обработки встроенного комментария '(например, ABC Bcd # в строке комментария)'? ура !! – MacUsers

+0

Отредактировал свой ответ. – gmaliar

Смежные вопросы