2014-09-02 2 views
0

저는 Ruby를 처음 사용합니다. Ruby를 사용하여 같은 텍스트 파일 내에서 변경 사항을 저장하려고합니다. 어떻게 접근합니까?txt 파일의 문자열을 Ruby로 바꿉니다.

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) ' –

+0

그게 효과가! . 이제 같은 파일 내에서 변경 사항을 저장하려고합니다. –

+0

파일을 현재 위치에서 변경할 수 없습니다. 대신 디스크에서 메모리로 읽어 와서 변경 한 후 다시 써야합니다. – Stefan

답변

1

나는 ShaneQful의 반응이 좋다 @이 코드를 사용하기 때문에 생각하지만 그는 이것이하는 일은이 file_name 문자열로를 판독 열립니다

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)) 

에 훨씬 더 쉽게이을 진술 할 수있다. old_color의 모든 인스턴스를 new_color으로 바꾸고 (#gsub) file_name에 다시 씁니다.

간단하고 쉽고 깨끗하며 간결합니다. 이

(ShaneQful의 예에서와 같이)

업데이트

벤치마킹의 File#read, File.open(file_name,&:read)File.open with block read into a string and then written back to file_name는 ~ 포함 잭 런던의 화이트 팡에 75,000 단어와 단어의 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#read 및으로 보입니다.구현 속도는 앞뒤가 맞지만 동일한 작업을 처리하기 위해 실제 블록을 사용하면 항상 이러한 유형의 작업이 훨씬 느립니다.

이 간단한 절차를위한 종관은 read 또는 #open(file_name,&:read) (Symbol#to_proc)입니다. 여러 라인이나 조건부 옵션을 취할 수있는 정교한 변경을 수행해야한다면 블록을 사용할 것입니다.

+0

** 나는 루비를 처음 사용합니다. ** 그리고 당신은 &를 사용 했습니까? 나는 루비에게 늙었 고 나는 그 perlish 코드를 쓰지 않을 것이다. 또한 파일을 열 때 블록을 사용하면 다른 장점이 있습니다. – 7stud

+0

@ 7stud Symbol # to_proc을 사용하기로 선택했는데, 구현이 더 깨끗하고이 경우 블록보다 성능이 좋기 때문입니다. OP도 "... 또는 '화이트'를 '블랙'으로 대체 할 수있는 다른 방법 일 수 있다는 사실을 기억해주십시오." – engineersmnky

+0

'File.read (name)'보다'File.open (name, & : read)'에 이점이 있습니까? –

1

은 다음과 같습니다있다 this을하는 쉬운 방법이 있습니다하지만 난 당신이 이해하기 쉽도록 자신의 코드를 사용하고 싶었

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} 

.

설명 : 수정 된 줄을 문자열에 저장 한 다음 파일에 쓰겠습니다.

+0

문자열에 기록 할 줄을 집계하지 마십시오. 프로그램의 메모리가 부족하면 문제가 발생할 수 있습니다. 문자열을 저장하는 대신 즉시 문자열을 씁니다. 따라서 사용 가능한 메모리가 많이 유지되고 I/O 속도에 영향을 미치지 않습니다. http://stackoverflow.com/a/25189286/128421 –

1

저는 루비를 처음 사용합니다. 같은 텍스트 파일 내에서 변경 사항을 저장하려고합니다. ruby를 사용합니다.

실용적인 목적으로는 할 수 없으며 어쨌든 절대 원하지 않습니다. 대신 새 파일에 쓰고 오래된 파일을 삭제하고 새 파일의 이름을 이전 파일 이름으로 바꿉니다.

관련 문제