2016-06-17 46 views
1

我想要做的是这样做,从文件中读取,在一行上输出文件的每一行,并且如果输出不匹配匹配输入,进入下一个在同一行,例如:如何用新行覆盖当前行以仅保留一行数据

文本文件:

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 
+2

可以给出示例输入和预期输出吗?现在我不明白你想达到什么:) – niceman

+0

@niceman这将是很难举一个例子,我的意思是这个我想从文件中的单词出现在最后一个字的位置该文件,例如:'比较为什么你好'你好将被替换为'再见'而不会去一个新的行。 – Donovan

+1

欢迎来到Stack Overflow。请阅读“[问]”,包括链接的页面和“[mcve]”。我们需要一个可用的输入和期望输出的例子。它可以帮助我们帮助你,并且它可以帮助其他人了解你的问题,以及它是否符合他们看到的问题,这是什么。 “我想要做的是这样做,从文件中读取,在一行上输出文件的每一行,如果输出不匹配匹配的输入,则转到同一行上的下一行”没有多大意义。 –

回答

0

我觉得你loop do是创造一个无限循环。我看不出有什么理由在这里添加一个循环。另外,我认为你需要在word变量上调用chomp来删除尾随的换行符。

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并在代码中放置一个断点。然后你可以在运行时检查你的变量的值。

+0

那完全不是我想要做的?我想要在同一行上生成的信息,并覆盖该单词直到找到匹配结果 – Donovan

+0

您仍未显示示例输出。我真的不知道你的意思是“覆盖每个单词,直到找到匹配” –

+0

在IRB中运行此问题http://stackoverflow.com/questions/37890340/how-to-overwrite-the-current-line-with-新线保留只有一行dat/37890614#37890614这是最接近我可以得到的一个例子,它是@ Sculper的答案 – Donovan

1

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

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

这就是说,我独自一人怀疑这个代码将解决你的问题 - 你给的例子输出表明你的代码是陷入无限循环。正如马克斯提到的,这是因为你的loop do不仅是多余的(你已经在迭代从文件中搜集的单词),但是没有退出条件 - 它永远不会停止。

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

应改为:

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

这正是我想要做的,但是我希望文件中的单词被替换而不是 – Donovan

+0

@Donovan它不会被替换,因为您的代码被卡在无限循环中。我已经更新了答案,使其更加清晰。 – Sculper

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 

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