2014-09-02 45 views
0

我是ruby的新手。我正在嘗試使用Ruby在同一文本文件中保存更改。我如何解決這個問題?用Ruby替換txt文件中的字符串

這是我的嘗試:

f = File.open("D:/test.txt", "r") 
oldcolor = "white" 
newcolor = "black" 
f.each_line do |line| 
    line.sub(oldcolor,newcolor) 
    puts line 
end 
f.close 

任何建議如何使用變量sub代替正則表達式,也可以是其他任何方法來代替「白色」,以「黑」?

+1

嘗試'puts line.sub(oldcolor,newcolor)' – 2014-09-02 18:12:13

+0

這工作! 。現在我正試圖在同一個文件中保存更改 – 2014-09-02 18:13:50

+0

您不能原地更改文件。相反,您必須將其從磁盤讀取到內存中,進行更改並將其寫回。 – Stefan 2014-09-02 18:31:56

回答

1

我認爲,@ ShaneQful的反應是良好的,因爲它使用你的代碼,但你可以爲他說讓這個更容易與

file_name = "D:/test.txt" 
old_color = "white" 
new_color = "black" 
File.write(file_name,File.open(file_name,&:read).gsub(old_color,new_color)) 

它打開file_name讀出它轉換成字符串這樣做是什麼。用new_color替換(#gsubold_color的所有實例,然後將其寫回file_name

簡單,簡單,乾淨,簡潔。

更新

標杆的

File#readFile.open(file_name,&:read)File.open with block read into a string and then written back to file_name(如ShaneQful的例子)

這是基準對傑克·倫敦的白牙包含〜75000個字與字的645個實例white

#Benchmark 
Rehearsal -------------------------------------------------------- 
File#read    0.375000 0.484000 0.859000 ( 1.462000) 
File.open(&:read)  0.437000 0.530000 0.967000 ( 1.480000) 
File.open with block 1.404000 0.359000 1.763000 ( 2.150000) 
----------------------------------------------- total: 3.589000sec 

          user  system  total  real 
File#read    0.452000 0.499000 0.951000 ( 1.401000) 
File.open(&:read)  0.483000 0.421000 0.904000 ( 1.445000) 
File.open with block 1.529000 0.328000 1.857000 ( 2.120000) 
#Fruity 
Running each test 2 times. Test will take about 3 minutes. 
File.open(&:read) is similar to File#read 
File#read is faster than File.open with block by 50.0% ± 10.0% 

看起來好像是File#readFile.open(file_name,&:read)貿易雙方在實施速度方面來來往往,但利用真正的區塊來處理同樣的操作對於這種類型的東西總是要慢得多。

這個簡單的程序使用簡介read#open(file_name,&:read)Symbol#to_proc)。如果您需要執行可能需要多行或條件選項的詳細更改,那麼我會使用一個塊

+0

**我是新來的紅寶石。**你用&:讀?我已經很老了,我不會寫那個普通代碼。打開文件時使用塊還有其他好處。 – 7stud 2014-09-02 21:16:46

+0

@ 7stud我選擇使用Symbol#to_proc,因爲在這種情況下,實現更乾淨並且性能比塊要好。請記住OP還陳述了「...或者可能有其他方法來替換'white'到'black'?」 – engineersmnky 2014-09-03 01:45:12

+0

'File.read(name)''File.open(name,&:read)'有什麼優點嗎? – 2014-09-03 07:10:27

1

你需要做的是:

f = File.open("D:/test.txt", "r") 
oldcolor = "white" 
newcolor = "black" 
newfile_str = "" 
f.each_line do |line| 
    newfile_str += line.sub(oldcolor,newcolor) 
end 
f.close 
File.open("D:/test.txt", "w") {|file| file.puts newfile_str} 

有這樣做this更簡單的方法,但我想用自己的代碼,使你更容易理解。

說明: 我將修改的行存儲在一個字符串中,然後將其寫入文件。

+0

不要聚合要寫入字符串的行。如果程序內存不足,則會產生潛在的問題。而不是存儲字符串,請立即寫出來。這樣可以保留儘可能多的內存,並且不會影響I/O速度。 http://stackoverflow.com/a/25189286/128421 – 2014-11-26 18:44:00

1

我是新來的紅寶石。我正在嘗試使用ruby在同一個文本文件 中保存更改。

對於所有的實際目的,你不能,而你真的不想,反正 - 永遠。相反,寫入新文件,刪除舊文件,將新文件重命名爲舊文件名。