Чтение определенных строк из внешнего файла в ruby ​​IO - PullRequest
2 голосов
/ 20 июля 2011

У меня есть этот код:

File.foreach("testfile.txt") { |line| print line }
lines = File.readlines("testfile.txt")
lines.each { |line| print line }

Ex. как я могу отредактировать это как получить определенную строку из testfile.txt?

$text2 = gets("some code to give me text on line 2 from textfile.txt").chomp

Итак, я хочу запустить программу, которая ищет 4 различные переменные, которые могут быть изменены любым пользователем. Они будут в отдельном файле, и, следовательно, код не нужно будет переписывать, чтобы изменить тест для нового набора поисковых запросов.

Скажем, у меня есть документ (я полагаю, текст самый простой, но, вероятно, ошибочный), который выглядит следующим образом:

Tea

Coffee

Hot Chocolate

Cookies

Это будет все, что есть в файле. И другой файл (.rb) извлекает эти переменные и ищет их в Google или в любом другом месте. Если код читает в байтах, я не смог бы изменить переменные на более длинные или короткие.

Было бы целесообразно, чтобы в документе говорилось

1:Tea

2:Coffee

3:Hot Chocolate

4:Cookies

До тех пор, пока код вытащит только «Чай» или «Кофе», а не предыдущий номер.

Ответы [ 4 ]

3 голосов
/ 20 июля 2011

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

Решение 1:

def read_line_number(filename, number)
  return nil if number < 1
  line = File.readlines(filename)[number-1]
  line ? line.chomp : nil
end

Решение 2a- немного эффективнее, потому что он не пытается прочитать весь файл:

require 'english'
def read_line_number_1a(filename, number)
  found_line = nil
  File.foreach(filename) do |line|
    if $INPUT_LINE_NUMBER == number
      found_line = line.chomp
      break
    end
  end
  found_line
end

Решение 2b - также эффективно, но в более функциональном стиле (хотя я не проверял, будет ли detect читатьв конец файла)

def read_line_number(filename, match_num)
  found_line, _idx =
    File.enum_for(:foreach, filename).each_with_index.detect do |_cur_line, idx|
      cur_line_num = idx+1
      cur_line_num == match_num
    end
  found_line.chomp
end

Использование:

text = read_line_number("testfile.txt", 2)
0 голосов
/ 15 июля 2014
def read_line_number(filename, number)
f = File.open(filename)
l = nil
begin
  number.times do 
  l = f.readline.chomp
  end
rescue
puts "End of file reached"
else
f.close unless f.nil?
return l  
end
end
0 голосов
/ 21 июля 2011

Решение, которое у меня есть:

Мой testfile.txt читает

ДаДа это делаетЧеловек это удивительно

мой файл .rb читает

a = IO.readlines("testfile.txt").grep(/\w+/) <br /> puts "does it work...."<br /> sleep 2<br /> puts a[2]<br /> sleep 10

0 голосов
/ 20 июля 2011

Вы хотели бы использовать lines.grep "some string".Или просто lines[x], если вы точно знаете, какой номер строки x вы хотите.

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