Forum: Ruby on Rails How to edit each line of a file in ruby, without using a temp file

Posted by ni ed (nila)
on 2012-10-02 06:01
(Received via mailing list)
Hi,

Is there a way to edit each line in a file, without involving 2 files? 
Say,
the original file has,

test01
test02
test03

I want to edit it like
test01,a
test02,a
test03,a

Tried something like this, but it replaces some of the characters.
File.open('mytest.csv', 'r+') do |file|
      file.each_line do |line|
          file.seek(-line.length, IO::SEEK_CUR)
          file.puts 'a'
      end
end

Writing it to a temporary file and then replace the original file works,
However, I need to edit the file quite often and therefore prefer to do 
it
within the file itself .Any pointers are appreciated.

Thank you!
Posted by Colin Law (Guest)
on 2012-10-02 09:40
(Received via mailing list)
On 2 October 2012 05:00, Nila <enilanthi@gmail.com> wrote:
> test01,a
>
> Writing it to a temporary file and then replace the original file works,
> However, I need to edit the file quite often and therefore prefer to do it
> within the file itself .Any pointers are appreciated.

It sounds like you might be better using records in a database for
each line and re-generate the file when it is needed as a file.  Rails
is quite good at modifying records in a database :)

Colin
Posted by Walter Davis (walterdavis)
on 2012-10-02 16:14
(Received via mailing list)
On Oct 2, 2012, at 12:00 AM, Nila wrote:

> test02,a
> Writing it to a temporary file and then replace the original file works, 
However, I need to edit the file quite often and therefore prefer to do it within 
the file itself .Any pointers are appreciated.
You can stash the data in an array, manipulate it there, and then write 
it back to the file store after. Ignore the HEREDOC parts of this, and 
substitute your file read/write bits, and this should work:

foo = <<EOF
one
two
three
EOF
bar = []
foo.each_line do |line|
  bar.push (line.strip + ',a')
end
foo = bar.join("\n")
puts foo

Walter
Posted by ni ed (nila)
on 2012-10-08 08:13
Thank you very much for the help.
Posted by Robert Walker (robert4723)
on 2012-10-08 14:11
Walter Davis wrote in post #1078369:
> On Oct 2, 2012, at 12:00 AM, Nila wrote:
>
>> test02,a
>> Writing it to a temporary file and then replace the original file works,
> However, I need to edit the file quite often and therefore prefer to do
> it within
> the file itself .Any pointers are appreciated.
> You can stash the data in an array, manipulate it there, and then write
> it back to the file store after. Ignore the HEREDOC parts of this, and
> substitute your file read/write bits, and this should work:
>
> foo = <<EOF
> one
> two
> three
> EOF
> bar = []
> foo.each_line do |line|
>   bar.push (line.strip + ',a')
> end
> foo = bar.join("\n")
> puts foo

Keep in mind that doing it this way will load the entire file into RAM, 
may not be an issue given today's servers have lots of RAM. However, 
doing what Colin suggested, using a database, would almost certainly be 
the more efficient solution.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.