如何使用新行覆盖当前行以仅保留一行数据

时间:2016-06-17 21:03:25

标签: ruby loops

我想要做的是,从文件中读取,在一行上输出文件的每一行,如果输出与匹配的输入不匹配,则转到同一行的下一行,例如:< / p>

文字档案:

hello
goodbye
yes
no
why
maybe
okay
tomorrow

代码:

def compare(input)
  File.readlines('test.txt').each do |word|
    if word == input
      puts "Found a match! #{word} == #{input}"
    else
      loop do
        puts "Comparing #{input} to #{word}" #<= Overwrite the current compared word, with the new compared word
        $stdout.flush        
      end
    end
  end
end

我该如何正确地做到这一点?我相信我可以使用\r删除该行但是当我添加\r并运行它时输出:

Comparing why to word

Comparing why to word

Comparing why to word

Comparing why to word

Comparing why to word

Comparing why to word

Comparing why to word

我最接近的一个例子是,如果你复制@ Sculper的答案并在IRB中运行

(1..5).each do |i|
  print "test #{i}\r" # Courtesy of @Sculpur
  $stdout.flush
  sleep(1)
end

3 个答案:

答案 0 :(得分:1)

如果要替换单行输出,则需要使用print而不是puts。例如:

(1..5).each do |i|
  print "test #{i}\r"
  $stdout.flush
  sleep(1)
end

那就是说,我怀疑这个代码本身就能解决你的问题 - 你给出的示例输出表明你的代码陷入无限循环。正如Max所说,这是因为你的loop do不仅是多余的(你已经在迭代从文件中收集的单词),但是没有退出条件 - 它永远不会停止。

loop do
  puts "Comparing #{input} to #{word}"
  $stdout.flush        
end

应替换为:

print "Comparing #{input} to #{word}"
$stdout.flush     

答案 1 :(得分:0)

我认为你的loop do正在创造一个无限循环。我没有看到任何在这里添加循环的理由。另外,我认为您需要在chomp变量上调用word来删除尾随的换行符。

即。

def compare(input)
  File.readlines('test.txt').each do |word|
    word = word.chomp # removes training '\n' character
    if word == input
      puts "Found a match! #{word} == #{input}"
    else
      puts "Comparing #{input} to #{word}"
    end
  end
end

在您的代码中,您说puts "Comparing #{input} to #{word}"会使用新的比较字覆盖当前比较的字词,但这不是真的。您根本没有在此处分配变量或更改应用程序状态 - 只需将某些内容记录到控制台即可。除非我不知道您使用$stdout.flush采取的某种方法,否则我认为这是不必要的。

如果一切都失败了,一个好的调试方法是安装prybyebug并在代码中放置一个断点。然后,您可以在运行时检查变量的值。

答案 2 :(得分:0)

尝试这样的事情:

def compare(input)
  arr = File.read('test.txt').split("\n")
  arr.each do |word|
    print "Comparing #{word} -> #{input}\r"
    $stdout.flush
    sleep(1)
    if word == input
      puts "Successfully found match! #{word} -> #{input}"
      exit
    end
  end
end

输出将全部在同一行,并将替换该单词。它并不完美,但它会起作用。关键是确保您的成功输出比测试输出更长。