我有这段代码:
File.foreach("testfile.txt") { |line| print line }
lines = File.readlines("testfile.txt")
lines.each { |line| print line }
实施例。我怎样才能将其编辑为获取来自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
只要代码只能提取“茶”或“咖啡”而不是前面的数字。
答案 0 :(得分:3)
听起来您不想返回与某个模式匹配的行,但您想要按行号抓取。
解决方案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)
答案 1 :(得分:0)
您可能希望使用lines.grep "some string"
。
如果您确切知道所需的行号lines[x]
,则只需x
。
答案 2 :(得分:0)
我的解决方案是:
我的testfile.txt读取
是的 是的确是 男人这太棒了
我的.rb文件读取
a = IO.readlines("testfile.txt").grep(/\w+/)
puts "does it work...."
sleep 2
puts a[2]
sleep 10
答案 3 :(得分:0)
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