2016-06-17 56 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 

輸出都將在同一行,並會替換詞。這不是完美的,但它會起作用。關鍵是要確保您的成功輸出比測試輸出更長。

相關問題