Разобрать определенное количество строк - PullRequest
1 голос
/ 11 июля 2010

Я пытаюсь прочитать файл, найти определенный шаблон и затем набрать определенное количество строк текста после строки, содержащей этот шаблон. Не совсем уверен, как подойти к этому.

Ответы [ 5 ]

1 голос
/ 11 июля 2010

Если вам нужно n число строк после совпадения строк pattern в файле filename:

lines = File.open(filename) do |file|
  line = file.readline until line =~ /pattern/ || file.eof;
  file.eof ? nil : (1..n).map { file.eof ? nil : file.readline }.compact
end

Это должно обрабатывать все случаи, например, шаблон, отсутствующий в файле(возвращает nil) или после совпадающих строк меньше n строк (результирующий массив, содержащий последние строки файла.)

1 голос
/ 11 июля 2010

Если вы не привязаны к Ruby, grep -A 12 trivet покажет 12 строк после любой строки с триветом в нем.Любое регулярное выражение будет работать вместо "trivet"

1 голос
/ 11 июля 2010

Сначала разберите файл на строки.Открыть, прочитать, разбить на разрыв строки

lines = File.open(file_name).read.split("\n")

Затем получить индекс

index = line.index{|x| x.match(/regex_pattern/)}

Где regex_pattern - шаблон, который вы ищете.Используйте индекс в качестве отправной точки, а затем второй аргумент - это количество строк (в данном случае 5)

lines[index, 5]

Он вернет массив 'lines'

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

0 голосов
/ 10 августа 2012

в рельсах (разница только в том, как я генерирую объект файла)

file = File.open(File.join(Rails.root, 'lib', 'file.json'))

 #convert file into an array of strings, with \n as the separator

 line_ary = file.readlines
 line_count = line_ary.count

 i = 0
  #or however far up the document you want to be...you can get very fancy with this or just do it manually

 hsh = {} 
 line_count.times do |l|
    child_id = JSON.parse(line_ary[i])
    i += 1
    parent_ary = JSON.parse(line_ary[i])
    i += 1
    hsh[child_id] = parent_ary
  end

ха-ха, я сказал слишком много, что, безусловно, должно помочь вам начать

0 голосов
/ 11 июля 2010
matched = false;
num = 0;
res = "";

new File(filename).each_line { |line|
    if (matched) {
        res += line+"\n";
        num++;
        if (num == num_lines_desired) {
            break;
        }
    } elsif (line.match(/regex/)) {
        matched = true;
    }

}

Это имеет то преимущество, что нет необходимости читать весь файл в случае совпадения.

Когда закончите, res будет содержать нужные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...