[R] replace a few strings in a text file
Dear all, I wrote a wrapper to a FORTRAN program using R. The main program uses a text file (~200 lines) as an input describing the simulation to be run. I typically generate the file once with the right parameters using a combination of file(), paste(), cat(). This is fine, and it works well, however I then need to update only a few values in the file many times (~200 times, typically). I've used Ruby for this task in the past, and I wonder whether there is a simple and efficient way to achieve this in R. Here's a minimal example, myFile - test.txt writeHeader - function (out=myFile, N=5, wavelength=0.1) { output - file(paste(out), w) headerString - c(Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Variables, wavelength, N, - wavelength - ind_refMed Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ) cat(paste(headerString), file = output, sep = \n) close(output) } writeHeader(out=myFile) system(paste(cat, myFile)) system.time(sapply(1:200, writeHeader) - b.quiet) Now for the ruby replacement solution: #!/usr/bin/ruby -w lambda = 0.1 N = 5 input_file=IO.readlines('test.txt') # replace wavelength input_file[6]= lambda.to_f input_file[7]= N.to_f f=File.new(test2.txt,w) f.puts input_file f.close I think (unverified) that this approach is more efficient than calling the writeHeader() each time. Please do let me know if I'm wrong on this. The drawback of using this Ruby script is that I need to know the numbers of the lines to be replaced (also, I don't know much in Ruby). I'm not sure how I can find this other than manually, as there is no regular pattern to look for. Ideally the generating script writeHeader() would return these line numbers, I'm not sure how to achieve this. Any comments are welcome. Best regards, baptiste (R7.2, MacOS 10.5) _ Baptiste AuguiƩ School of Physics University of Exeter Stocker Road, Exeter, Devon, EX4 4QL, UK Phone: +44 1392 264187 http://newton.ex.ac.uk/research/emag __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Re: [R] replace a few strings in a text file
baptiste auguie wrote: Dear all, I wrote a wrapper to a FORTRAN program using R. The main program uses a text file (~200 lines) as an input describing the simulation to be run. I typically generate the file once with the right parameters using a combination of file(), paste(), cat(). This is fine, and it works well, however I then need to update only a few values in the file many times (~200 times, typically). I've used Ruby for this task in the past, and I wonder whether there is a simple and efficient way to achieve this in R. Here's a minimal example, myFile - test.txt writeHeader - function (out=myFile, N=5, wavelength=0.1) { output - file(paste(out), w) headerString - c(Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Variables, wavelength, N, - wavelength - ind_refMed Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ) cat(paste(headerString), file = output, sep = \n) close(output) } writeHeader(out=myFile) system(paste(cat, myFile)) system.time(sapply(1:200, writeHeader) - b.quiet) Now for the ruby replacement solution: #!/usr/bin/ruby -w lambda = 0.1 N = 5 input_file=IO.readlines('test.txt') # replace wavelength input_file[6]= lambda.to_f input_file[7]= N.to_f f=File.new(test2.txt,w) f.puts input_file f.close I think (unverified) that this approach is more efficient than calling the writeHeader() each time. Please do let me know if I'm wrong on this. The drawback of using this Ruby script is that I need to know the numbers of the lines to be replaced (also, I don't know much in Ruby). I'm not sure how I can find this other than manually, as there is no regular pattern to look for. Ideally the generating script writeHeader() would return these line numbers, I'm not sure how to achieve this. Any comments are welcome. If there are only 200 lines, why not put them into a character vector, and edit them there? That's more or less what your Ruby code does. In R, it would be written input_file - readLines(test.txt) input_file[6] - sprintf(%f, lambda) input_file[7] - sprintf(%f, N) writeLines(test2.txt, input_file) but if everything is in R, you don't need the first line. Duncan Murdoch __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.
Re: [R] replace a few strings in a text file
First of all, let me apologize for the 200 files that would result from running my minimal example. I've just realised this on my Desktop; it seems i overlooked the arguments passed to sapply(). Thank you for your reply Duncan, I realize now my approach was quite silly. It is indeed much more natural to create and manipulate all the strings in R and write the new file every time in a single step. Thanks, baptiste On 27 Oct 2008, at 10:47, Duncan Murdoch wrote: baptiste auguie wrote: Dear all, I wrote a wrapper to a FORTRAN program using R. The main program uses a text file (~200 lines) as an input describing the simulation to be run. I typically generate the file once with the right parameters using a combination of file(), paste(), cat(). This is fine, and it works well, however I then need to update only a few values in the file many times (~200 times, typically). I've used Ruby for this task in the past, and I wonder whether there is a simple and efficient way to achieve this in R. Here's a minimal example, myFile - test.txt writeHeader - function (out=myFile, N=5, wavelength=0.1) { output - file(paste(out), w) headerString - c(Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Variables, wavelength, N, - wavelength - ind_refMed Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ) cat(paste(headerString), file = output, sep = \n) close(output) } writeHeader(out=myFile) system(paste(cat, myFile)) system.time(sapply(1:200, writeHeader) - b.quiet) Now for the ruby replacement solution: #!/usr/bin/ruby -w lambda = 0.1 N = 5 input_file=IO.readlines('test.txt') # replace wavelength input_file[6]= lambda.to_f input_file[7]= N.to_f f=File.new(test2.txt,w) f.puts input_file f.close I think (unverified) that this approach is more efficient than calling the writeHeader() each time. Please do let me know if I'm wrong on this. The drawback of using this Ruby script is that I need to know the numbers of the lines to be replaced (also, I don't know much in Ruby). I'm not sure how I can find this other than manually, as there is no regular pattern to look for. Ideally the generating script writeHeader() would return these line numbers, I'm not sure how to achieve this. Any comments are welcome. If there are only 200 lines, why not put them into a character vector, and edit them there? That's more or less what your Ruby code does. In R, it would be written input_file - readLines(test.txt) input_file[6] - sprintf(%f, lambda) input_file[7] - sprintf(%f, N) writeLines(test2.txt, input_file) but if everything is in R, you don't need the first line. Duncan Murdoch __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. _ Baptiste AuguiƩ School of Physics University of Exeter Stocker Road, Exeter, Devon, EX4 4QL, UK Phone: +44 1392 264187 http://newton.ex.ac.uk/research/emag __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.