2010-09-27 3 views
2

Следующий код открывает текстовый файл, немного регулярное выражение соответствует именам и номерам. Я делаю IF, так что я только сопоставляю числа, превышающие 0. Когда я пытаюсь указать имя и номер, я получаю только цифры, а имя становится нулевым. Если я помещаю имена (переменная а) перед оператором if, он есть. Что я делаю не так?Невозможно выставить несколько строк

nf = File.open("textfile.txt") 

nf.each do |b| 
a = b.match(/([\S]+)name([\S]+)/) 
c = b.match(/[0-9]+ numbers/) 
c = c.to_s.split(/ /) 
c = c[0].to_i 
    if c > 0 
    puts a 
    puts c 
    end 
end 

текстовый файл выглядит следующим образом:

Меня зовут Марк
12432 номера
Меня зовут Джо
0 номера

Я хочу, чтобы иметь возможность ставит:
Мое имя is Mark
12432 номера

и распечатать:
Меня зовут Джо
0 номера

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

ответ

1

Ну есть четыре линии. В строках 1 и 3 есть имя, поэтому a не будет nil. Однако c > 0 будет ложным, и поэтому ничего не будет напечатано.

В строках 2 и 4 нет имени, поэтому a - это нуль.

Edit: Также /([\S]+)name([\S]+)/ фактически никогда не будет соответствовать в вашем примере файла, так как «имя» окружен пробелами (и \S означает «не пробел»).

Edit2: Вот решение с использованием scan

File.read("textfile.txt").scan(/My name is (\w+)\n(\d+) numbers/) do |name, num| 
    num = num.to_i 
    if num > 0 
    puts "Name: #{name}" 
    puts "Number: #{num}" 
    end 
end 
+0

любые предложения по исправлению кода? – nomoreflash

+0

@lovecode: Не перебирайте по очереди. Итерации в группах из двух строк, если вы знаете, что файл выложен таким образом. Или прочитайте весь файл в строке и используйте 'scan', чтобы найти каждое имя имени + номер. – sepp2k

+0

Спасибо за подсказку в космосе, я внес изменения, но я все еще получаю только цифры и имена ноль. Обратите внимание, что если я помещаю (имена) перед оператором if, я получаю имена, но не после if. – nomoreflash

0

Проблема заключается в том, что вы пытаетесь соответствовать как Name и номера в одной и той же линии.

Быстрый скрипт, который работает, испытанные в IRB:

File.open("foo", "r") do |file| 
    while name_line = file.gets 
    if name_line =~ /\s+name\s+/ 
     number_line = file.gets # Here we read onto the next line 
     if match = number_line.match(/(\d+) numbers/) 
     # If matches, it will keep the number in the first capture group 
     puts name_line, match[1] if match[1].to_i > 0 
     end 
    end 
    end 
end 

Обратите внимание, что это не будет работать, если две последовательные строки совпадают «имя», а третий имеет «номера», которые не могут быть в случае

-1
p="" 
File.readlines("file").each do |line| 
    num = line.split[0] 
    if num.to_i > 0 
    print "#{p}#{line}" 
    else 
    p=line 
    end 
end 
Смежные вопросы