2013-10-21 29 views
1

我試圖逐行循環遍歷文件,替換子字符串。我有一個工作腳本 - 但如果有人可以幫助我理解了爲什麼(我原來的)腳本不工作,我會很感激的Ruby:n`[] =':字符串不匹配(IndexError)

File.open('input3400.txt', 'rb') do |f| 
    f.each_line do |i| 
    File.write('input3400.txt', i["<aspect name="] = "hi") 
    end 
end 

基本上,我想搜索該文件的所有實例<aspect name=並用hi替換它們。

`[] =:當我運行我發現了這個輸出 ':不匹配(IndexError)

`塊(2級)在串{頂部(必需)}'

`each_line '

`在塊{頂部(必需)}'

+1

所以,它是一個工作腳本或不工作的腳本? –

+0

這是一個不工作的腳本 - 我被給了一個替代答案,但我真的很想知道爲什麼這個(我的原始腳本)不起作用;我對Ruby很新,所以試圖學習:> – MrDuk

回答

1

首先,錯誤您有: i["<aspect name="] = "hi" 這個試圖替代"<aspect name=""hi"提出了一個錯誤,當"<aspect name="不希望字符串的子串。

然後,你必須有一個仔細看看這一行: File.write('input3400.txt', i["<aspect name="] = "hi")

爲何分配作爲第二個參數傳遞? Ruby上賦值的返回值是右邊的,沒錯,但是爲什麼在這裏使用賦值呢?

最後,File.write('input3400.txt', i["<aspect name="] = "hi") - 它不知道任何關於您的current_line(i)。你想在哪裏File.write呢?

希望有幫助!

3

它不起作用,因爲如果線DOE之一i["<aspect name="] = "hi"將引發一個例外IndexError不匹配<aspect name=模式。

0

你有幾個錯誤,第一個錯誤是變量是一個字符串,該方法[]試圖訪問索引<aspect name=不存在,第二個錯誤是,你無法更新您打開閱讀的文件,您必須將數據放在臨時位置,然後覆蓋原始文件。

嘗試使用此代碼:

require 'fileutils' 
require 'tempfile' 

t_file = Tempfile.new('input3400_temp.txt') 
File.open("input3400.txt", 'r') do |f| 
    f.each_line do |line| 
    t_file.puts(line.gsub('<aspect name=', 'hi')) 
    end 
end 
t_file.close 
FileUtils.mv(t_file.path, "input3400.txt") 
+0

>第一個錯誤是變量i是一個字符串,其中方法[]嘗試訪問索引

+0

如果[]中的字符串或正則表達式不匹配,則會引發異常,解析文件會拋出很多錯誤。你可以捕獲異常,但是代碼會稍微長一點,所以我想最好使用方法gsub並忘記那些異常 – rorra