"puts"ing an array


#1

Hi,
In the “pickaxe” book I see how to use a “puts” to populate a file with
data. I try the same thing, and, it works, but, it’s listing the data as
an array. How can I get separate lines for each item in the array?
Thanks,
Peter

In the book:
File.open(“output.txt”, “w”) do |file|
file.puts “Hello”
file.puts “1 + 2 = #{1+2}”
end

Now read the file in and print its contents to STDOUT

puts File.read(“output.txt”)
produces:
Hello
1 + 2 = 3

My script:
Dir.chdir(“L:/png/69000”)
files = Dir.glob("*.png")
File.open(“F:/workflows/graphics/receipts/pngfiles.txt”, “w”) do |file|
file.puts “#{files}”
end
produces:
69116.png69251.png69391.pngAZ69080.pngAZ69982.pngcx69362.pngcx69363.png
. . .


#2

On Tue, Jun 9, 2009 at 2:52 PM, Peter B.removed_email_address@domain.invalid wrote:

file.puts “1 + 2 = #{1+2}”
File.open(“F:/workflows/graphics/receipts/pngfiles.txt”, “w”) do |file|
file.puts “#{files}”
end
produces:
69116.png69251.png69391.pngAZ69080.pngAZ69982.pngcx69362.pngcx69363.png

Dir.glob returns an array, so two possibilities are (untested):

File.open(“F:/workflows/graphics/receipts/pngfiles.txt”, “w”) do |file|
file.puts files.join("\n")
end

File.open(“F:/workflows/graphics/receipts/pngfiles.txt”, “w”) do |file|
files.each {|f| file.puts f }
end

Hope this helps,

Jesus.


#3

On Jun 9, 2009, at 8:52 AM, Peter B. wrote:

File.open(“output.txt”, “w”) do |file|
Dir.chdir(“L:/png/69000”)
files = Dir.glob("*.png")
Dir.glob returns an Array

File.open(“F:/workflows/graphics/receipts/pngfiles.txt”, “w”) do |
file|
file.puts “#{files}”
end
The default Array#to_s is like Array#join(’’). You probably want to
do either:
file.puts files.join("\n")
or iterate on the files:
files.each do |pngfilename|
file.puts pngfilename
end

produces:
69116
.png69251.png69391.pngAZ69080.pngAZ69982.pngcx69362.pngcx69363.png
. . .

-Rob

Rob B. http://agileconsultingllc.com
removed_email_address@domain.invalid


#4

2009/6/9 Rob B. removed_email_address@domain.invalid:

File.open(“output.txt”, “w”) do |file|
Dir.chdir(“L:/png/69000”)
file.puts files.join("\n")
or iterate on the files:
files.each do |pngfilename|
file.puts pngfilename
end

It’s even simpler:

file.puts files

Kind regards

robert


#5

Robert K. wrote:

2009/6/9 Rob B. removed_email_address@domain.invalid:

File.open(“output.txt”, “w”) do |file|
Dir.chdir(“L:/png/69000”)
�file.puts files.join("\n")
or iterate on the files:
�files.each do |pngfilename|
� �file.puts pngfilename
�end

It’s even simpler:

file.puts files

Kind regards

robert

Wow. Sometimes Ruby is too beautifully simple.
Thanks, Robert.
Peter


#6

Sometimes Ruby is too beautifully simple.

It inspired my general rule that if something is not looking beautiful -
or if it looks downright ugly - there must be a better way.


#7

Rob B. wrote:

On Jun 9, 2009, at 8:52 AM, Peter B. wrote:

File.open(“output.txt”, “w”) do |file|
Dir.chdir(“L:/png/69000”)
files = Dir.glob("*.png")
Dir.glob returns an Array

File.open(“F:/workflows/graphics/receipts/pngfiles.txt”, “w”) do |
file|
file.puts “#{files}”
end
The default Array#to_s is like Array#join(’’). You probably want to
do either:
file.puts files.join("\n")
or iterate on the files:
files.each do |pngfilename|
file.puts pngfilename
end

produces:
69116
.png69251.png69391.pngAZ69080.pngAZ69982.pngcx69362.pngcx69363.png
. . .

-Rob

Rob B. http://agileconsultingllc.com
removed_email_address@domain.invalid

Thank you very much, gentlemen. Yes, I did actually figure it out by
simply making two loops, one for the file and one for the png files
inside it.
Cheers,
Peter