Is there a simpler way to do this?

Discussion in 'Ruby' started by Julian Leviston, Aug 17, 2005.

  1. Hi.

    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.
    Julian Leviston, Aug 17, 2005
    #1
    1. Advertising

  2. On Aug 17, 2005, at 10:30 AM, Julian Leviston wrote:

    > Hi.
    >
    > 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


    file_contents = File.read("/usr/blah/1.txt")

    James Edward Gray II
    James Edward Gray II, Aug 17, 2005
    #2
    1. Advertising

  3. Julian Leviston

    Zach Dennis Guest

    James Edward Gray II wrote:

    > file_contents = File.read("/usr/blah/1.txt")


    or, for two more characters shortened...

    file_contents = IO.read("/usr/blah/1.txt")

    Zach
    Zach Dennis, Aug 17, 2005
    #3
  4. James Edward Gray II wrote:
    > On Aug 17, 2005, at 10:30 AM, Julian Leviston wrote:
    >
    >> Hi.
    >>
    >> 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

    >
    > file_contents = File.read("/usr/blah/1.txt")


    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
    Robert Klemme, Aug 17, 2005
    #4
  5. Zach Dennis wrote:
    > James Edward Gray II wrote:
    >
    >> file_contents = File.read("/usr/blah/1.txt")

    >
    > or, for two more characters shortened...
    >
    > file_contents = IO.read("/usr/blah/1.txt")


    One less...

    file_contents = IO.read "/usr/blah/1.txt"

    Of course, you can also truncate the variable name...
    :)

    robert
    Robert Klemme, Aug 17, 2005
    #5
  6. Julian Leviston

    Guest

    I believe the following does it...

    the_string=File.readlines("/usr/blah/1.txt"').join

    Dean
    , Aug 17, 2005
    #6
  7. On 8/17/05, <> wrote:
    > I believe the following does it...


    > the_string=3DFile.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 =3D 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
    --=20
    Austin Ziegler *
    * Alternate:
    Austin Ziegler, Aug 17, 2005
    #7
  8. > contents = open(filename, "rb") { |f| f.read }
    >
    > It's safe for text or binary files on all platforms.


    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
    Frank Wallingford, Aug 25, 2005
    #8
  9. Frank Wallingford wrote:
    > > contents = open(filename, "rb") { |f| f.read }
    > >
    > > It's safe for text or binary files on all platforms.

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


    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")
    William James, Aug 25, 2005
    #9
  10. William James wrote:
    > Frank Wallingford wrote:
    > > > contents = open(filename, "rb") { |f| f.read }
    > > >
    > > > It's safe for text or binary files on all platforms.

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

    >
    > 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/)
    William James, Aug 26, 2005
    #10
  11. Julian Leviston

    Guest


    > 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
    , Aug 27, 2005
    #11
  12. wrote:
    > > 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"]
    William James, Aug 27, 2005
    #12
  13. Julian Leviston

    Serpent Guest

    But my point is that reading text files in binary mode is bad. If you
    want this to work on all platforms, open text files in text mode and
    open binary files in binary mode.
    Serpent, Aug 28, 2005
    #13
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alex Nitulescu
    Replies:
    5
    Views:
    1,332
    Alan Silver
    Mar 3, 2005
  2. Kerim Borchaev

    super. could there be a simpler super?

    Kerim Borchaev, Jan 15, 2004, in forum: Python
    Replies:
    4
    Views:
    469
    Michele Simionato
    Jan 15, 2004
  3. tmallen
    Replies:
    19
    Views:
    540
    Miles
    Nov 5, 2008
  4. Ritchie Valens

    Is there a simpler way to do this?

    Ritchie Valens, Jul 30, 2011, in forum: Javascript
    Replies:
    6
    Views:
    583
    Scott Sauyet
    Aug 16, 2011
  5. Replies:
    20
    Views:
    358
    Ethan Furman
    Nov 16, 2012
Loading...

Share This Page