Add each array element to the lines of a file in ruby
Solution 1
Either use Array#each
to iterate over your array and call IO#puts
to write each element to the file (puts
adds a record separator, typically a newline character):
File.open("test.txt", "w+") do |f|
a.each { |element| f.puts(element) }
end
Or pass the whole array to puts
:
File.open("test.txt", "w+") do |f|
f.puts(a)
end
From the documentation:
If called with an array argument, writes each element on a new line.
Solution 2
There is a quite simpler solution :
IO.write("file_name.txt", your_array.join("\n"))
Solution 3
As an alternate, you could simply join the array with "\n" so that each element is on a new line, like this:
a = %w(a b c d)
File.open('test.txt', 'w') {|f| f.write a.join("\n")}
If you don't want to override the values already in the text file so that you're simply adding new information to the bottom, you can do this:
a = %w(a b c d)
File.open('test.txt', 'a') {|f| f << "\n#{a.join("\n")}"}
Solution 4
Use Array#each
to iterate each element. When writing to the file, make sure you append newline(\n
), or you will get a file with abcd
as content:
a = ['a', 'b', 'c', 'd']
File.open('test.txt', 'w') do |f|
a.each do |ch|
f.write("#{ch}\n")
end
end
Solution 5
Another simple solution:
directory = "#{Rails.root}/public/your_directory" #create your_directory before
file_name = "your_file.txt"
path = File.join(directory, file_name)
File.open(path, "wb") { |f| f.write(your_array.join("\n")) }
edc505
Updated on July 09, 2022Comments
-
edc505 almost 2 years
If I have an array of strings e.g.
a = ['a', 'b', 'c', 'd']
and I want to output the elements, to a file (e.g. .txt) one per line. So far I have:
File.new("test.txt", "w+") File.open("test.txt", "w+") do |i| i.write(a) end
This gives me the array on one line of the test.txt file. How can I iterate over the array, adding each value to a new line of the file?
-
falsetru over 10 years@SergioTulentsev, See
Enumerable
documentation. There's noeach
. -
Sergio Tulentsev over 10 yearsWhat? All these years I thought that each belongs to Enumerable.
-
falsetru over 10 years@SergioTulentsev,
Enumerable
is a just mixin. It does not defineeach
itself. -
Sergio Tulentsev over 10 yearsRight, it depends on
each
. -
edc505 over 10 yearsYour first suggestion was what I wanted. Thanks.
-
Phill Healey over 7 years@Dika Suparlan, welcome to SO. A little explanation is also helpful. Not only does it validate your answer but it gives the OP an indication of what they need to do both with the current issue and potentially in future situations. Im sure I'm not alone in wanting to learn from the SO community rather than just being given solutions. The greatest sense of success is in overcoming a good challenge. ;-)
-
daniel f. about 7 yearsJust a heads-up for people using a set instead of an array: only the first version works.
-
Stefan about 7 years@danielf. that's correct, as mentioned in the documentation, you have to call
puts
with an array argument to get that behavior. -
Purplejacket over 6 yearsThis should be the preferred answer. From the doc -- ruby-doc.org/core-2.4.2/IO.html -- IO.write(name, string [, offset] [, opt]) → integer --- Opens the file, optionally seeks to the given offset, writes string, then returns the length written. write ensures the file is closed before returning. If offset is not given, the file is truncated. Otherwise, it is not truncated.