Как это сделать в Ruby? - PullRequest
       3

Как это сделать в Ruby?

0 голосов
/ 03 января 2012

У меня есть файл, сгенерированный компилятором, который имеет предупреждающие сообщения в следующем формате:

--a couple of lines of text--

    Warning-[code1] <some description>
    <some path>, error code
    --3-4 lines of cryptic messages--

    Warning-[code2] <some description>
    <some path>, error code
    --3-4 lines of cryptic messages--

    Warning-[code1] <some description>
    <some path>, error code
    --3-4 lines of cryptic messages--

    etc...

У меня есть скрипт, который будет читать в кодах, но проблема в том, что некоторые коды повторяются как 10раз, и я хочу прочитать их один раз, т.е.Я думал о том, чтобы прочитать весь файл в массиве, а затем uniquify его на основе кодов?Но возможно ли это?прежде чем я продолжу и начну кодировать.

Очень ценю ваш вклад / помощь / мысли :)

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Хэш-структура предоставляет простой метод для сбора такого рода информации. Если вы можете извлечь ключ, просто захватите нужный вам блок данных, либо замените его, либо используйте первый экземпляр.

Пример:

capturing = nil
captured = { }

while (line = gets)
  if (line.match(/...starting...(code).../))
    capturing = ''
    key = $1
  elsif (capturing and line.match(/...finishing.../)
    captured[key] ||= capturing
    capturing = nil
  elsif (capturing)
    capturing << line
  end
end

Это общий шаблон для извлечения разделенной информации из файла журнала. Разумеется, вам нужно будет настроить начальные и конечные регулярные выражения.

0 голосов
/ 04 января 2012

Чтение всего файла в массиве может быть очень неэффективным с точки зрения памяти, если файл слишком большой.В таком случае рекомендуется построчно просматривать файл и собирать необходимые данные.

Если все, что вам нужно, это просто коды, то вы можете действовать следующим образом:

или с использованием Ruby's Set :

require 'set'

codes = Set.new

File.foreach("logfile") do |line|
  if m = line.match(/Warning-\[(.+?)\]/)
    codes.add(m[1])
  end
end
...