Just wondering if there's a simpler way to do this?
file = File.open("/usr/blah/1.txt") do | file |
while line = file.gets
the_string += line
end
end
In other words, open a file, read the contents into a string called
the_string
Thanks,
Julian.
file_contents = File.read("/usr/blah/1.txt")
James Edward Gray II
> file_contents = File.read("/usr/blah/1.txt")
or, for two more characters shortened...
file_contents = IO.read("/usr/blah/1.txt")
Zach
I was tempted to say "of course there is". It's so typical Ruby. :-)
Btw, a remark to the OP's algorithm: IMHO this one is more efficient since
it does not create new String objects all the time:
file = File.open("/usr/blah/1.txt") do | file |
s = ""
while line = file.gets
s << line
end
s
end
Note also that you might get nil instead of the empty string in your
example if reading from an empty file (untested). But of course the one
liner is even more efficient. :-)
Kind regards
robert
One less...
file_contents = IO.read "/usr/blah/1.txt"
Of course, you can also truncate the variable name...
:-)
robert
the_string=File.readlines("/usr/blah/1.txt"').join
Dean
> the_string=File.readlines("/usr/blah/1.txt"').join
Yes. But there's a problem with this -- it does more work than
necessary. The IO.read approach that is superior. However, I prefer:
contents = open(filename, "rb") { |f| f.read }
It's not quite as short as the IO.read approach, but it does two things for me:
1. It's safe for text or binary files on all platforms.
2. Because I'm using "open", if I do "require 'open-uri'", then
filename can also be a URL to a remoate location.
-austin
--
Austin Ziegler * halos...@gmail.com
* Alternate: aus...@halostatue.ca
Is this true?
I couldn't find an answer in my quick glance over the standard library
docs, but I was under the impression that if you open a text file in
binary mode on some platforms that do text-mode translation for you
(Windows, for example), then you lose the translation. You may get
"\r\n" instead of "\n" for newlines (since that's how they exist in
binary on disk) and you may get "^Z" for the end of file marker.
I don't have a Windows machine to test with at the moment, but wouldn't
you get those extra \r and ^Z characters if you opened a text file in
binary mode?
-Frank
Just tried it. You get the \r characters but not the ^Z.
The end of file marker was only needed in the days when the messy-dos
filesystem didn't record the actual size of the file's contents.
After using the command above, you would split contents into
lines using
contents.split("\r\n")
Since this is supposed to work on all platforms:
contents.split(/(?:\r\n?)|\n/)
Can you explain this pattern please ? I don't understand the "?:" part.
Francis
In a regexp, ( ) groups and captures; (?: ) groups without capturing.
But I made it too complex. The group isn't necessary:
irb(main):002:0> "a\nb\nc\r\nd\r\ne\rf".split(/\r\n?|\n/)
=> ["a", "b", "c", "d", "e", "f"]