[R] replace a few strings in a text file

2008-10-27 Thread baptiste auguie

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

2008-10-27 Thread Duncan Murdoch

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

2008-10-27 Thread baptiste auguie
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.