34

This is what I want to do, but with a one-liner:

lines = Array.new
File.open('test.txt').each { |line| lines << line }

Possible?

yegor256
  • 102,010
  • 123
  • 446
  • 597
  • 2
    Be *VERY* careful reading a file into memory all at once. It's not scalable, and can easily make a program crawl if the file turns out to be bigger than the available memory. Line-by-line is as fast and is the way to go if at all possible. – the Tin Man Aug 06 '14 at 20:42
  • 1
    @theTinMan `IO::foreach` does file processing _line by line_. But when someone is trying to get the lines in an _array_, `#readlines` very good way to go, rather than `ar = []; File.foreach('test.txt') { |line| ar << line }`. I didn't check, but I am sure, in `C` level, `readlines()` probably does something like that internally already.As opposed to slurping up the whole file at once and *then* breaking it down into lines. – Arup Rakshit Aug 07 '14 at 06:04
  • 1
    `each` is safe because it's the instance version of `foreach`. I have read the C source, and `readlines` doesn't scale because it aggregates an entire file into memory. That's a bad practice, even today when machines have more memory and are faster, because files are bigger too. An unexpectedly big file, bigger than Ruby can handle, will take a machine to a crawl. That's unnecessary, and unacceptable in production environments. – the Tin Man Aug 07 '14 at 15:51
  • See "[Why is slurping a file bad?](http://stackoverflow.com/questions/25189262/why-is-slurping-a-file-bad?)" – the Tin Man Aug 07 '14 at 18:30

1 Answers1

74

Do as below :

File.readlines('test.txt')

Read documentation :

arup@linux-wzza:~> ri IO::readlines

= IO::readlines

(from ruby site)
------------------------------------------------------------------------------
  IO.readlines(name, sep=$/ [, open_args])     -> array
  IO.readlines(name, limit [, open_args])      -> array
  IO.readlines(name, sep, limit [, open_args]) -> array

------------------------------------------------------------------------------

Reads the entire file specified by name as individual lines, and
returns those lines in an array. Lines are separated by sep.

  a = IO.readlines("testfile")
  a[0]   #=> "This is line one\n"

If the last argument is a hash, it's the keyword argument to open. See IO.read
for detail.

Example

arup@linux-wzza:~/Ruby> cat out.txt
name,age,location
Ram,12, UK
Jadu,11, USA
arup@linux-wzza:~/Ruby> ruby -e "p File::readlines('./out.txt')"
["name,age,location\n", "Ram,12, UK\n", "Jadu,11, USA\n"]
arup@linux-wzza:~/Ruby>
Chris
  • 5,788
  • 4
  • 29
  • 40
Arup Rakshit
  • 116,827
  • 30
  • 260
  • 317