# Write a file

**URL:** <https://www.ruby-forum.com/t/write-a-file/176953>\
**Category:** Ruby\
**Created:** [October 8, 2009, 10:07pm UTC](https://www.ruby-forum.com/t/write-a-file/176953 "2009-10-08T22:07:13Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![alex-osu3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@alex-osu3](https://www.ruby-forum.com/u/alex-osu3)\
**Post date:** [October 8, 2009, 10:07pm UTC](https://www.ruby-forum.com/t/write-a-file/176953/1 "2009-10-08T22:07:13Z")

</div>

Hi all,

I use the following script to write a 2D array. I wonder if there is  
improvement for them.

Thanks,

Li

############script##########  
data\_all=[  
(1…10).to\_a,  
(1…10).to\_a,  
(1…10).to\_a,  
(1…10).to\_a  
]# a 2D array

File.open(‘test3.txt’,‘w’) do |a\_f|  
data\_all.each do |row |  
row.each {|e| a\_f.print e ; a\_f.print “\t”}  
a\_f.puts  
end

end

---

<div class="post-metadata">

**Author:** ![alex-osu3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@alex-osu3](https://www.ruby-forum.com/u/alex-osu3)\
**Post date:** [October 8, 2009, 10:20pm UTC](https://www.ruby-forum.com/t/write-a-file/176953/2 "2009-10-08T22:20:15Z")

</div>

Li Chen wrote:

> Hi all,
> 
> I use the following script to write a 2D array. I wonder if there is  
> improvement for them.
> 
> Thanks,
> 
> Li
> 
> ############script##########  
> data\_all=[  
> (1…10).to\_a,  
> (1…10).to\_a,  
> (1…10).to\_a,  
> (1…10).to\_a  
> ]# a 2D array
> 
> File.open(‘test3.txt’,‘w’) do |a\_f|  
> data\_all.each do |row |  
> row.each {|e| a\_f.print e ; a\_f.print “\t”}  
> a\_f.puts  
> end
> 
> end

What you have is good enough.  
There are a few things which could be better, for example formatting  
(sprintf), and error reporting, also what I would do is to encapsulate  
this code into a function so that you can re use it later on.

def array2D\_to\_file(array2D,file\_name)  
…  
…  
end

my 2 cents

---

<div class="post-metadata">

**Author:** ![alex-osu3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@alex-osu3](https://www.ruby-forum.com/u/alex-osu3)\
**Post date:** [October 9, 2009, 12:33am UTC](https://www.ruby-forum.com/t/write-a-file/176953/3 "2009-10-09T00:33:39Z")

</div>

Rodrigo B. wrote:

> What you have is good enough.  
> There are a few things which could be better, for example formatting  
> (sprintf), and error reporting, also what I would do is to encapsulate  
> this code into a function so that you can re use it later on.
> 
> def array2D\_to\_file(array2D,file\_name)  
> …  
> …  
> end
> 
> my 2 cents

Unfortunately Excel doesn’t see the formatted outputs correctly, so I  
don’t perform the formatting.

Li

---

<div class="post-metadata">

**Author:** ![alex-osu3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@alex-osu3](https://www.ruby-forum.com/u/alex-osu3)\
**Post date:** [October 9, 2009, 4:09am UTC](https://www.ruby-forum.com/t/write-a-file/176953/4 "2009-10-09T04:09:38Z")

</div>

On Fri, Oct 9, 2009 at 4:07 AM, Li Chen [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> I use the following script to write a 2D array. I wonder if there is  
> improvement for them.

you may want to look at fastercsv.

kind regards -botp

---

<div class="post-metadata">

**Author:** ![alex-osu3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@alex-osu3](https://www.ruby-forum.com/u/alex-osu3)\
**Post date:** [October 9, 2009, 12:45pm UTC](https://www.ruby-forum.com/t/write-a-file/176953/5 "2009-10-09T12:45:54Z")

</div>

On Oct 8, 4:07 pm, Li Chen [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> a_f.puts
> end
> 
> ```
> 
> end

I would do something more along the lines of this:

File.open(‘test.txt’, ‘w’) do |file|  
data\_all.each do |row|  
file.puts row.join(“\t”)  
end  
end

On Oct 8, 10:09 pm, botp [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> you may want to look at fastercsv.
> 
> kind regards -botp

This is tab-separated, but if Excel is the ultimate goal, I guess that  
CSV would work. Fortunately, I don’t use Excel, so I don’t know much  
along those lines.

---

<div class="post-metadata">

**Author:** ![alex-osu3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@alex-osu3](https://www.ruby-forum.com/u/alex-osu3)\
**Post date:** [October 9, 2009, 6:55am UTC](https://www.ruby-forum.com/t/write-a-file/176953/6 "2009-10-09T06:55:34Z")

</div>

#I try to shorten it

File.open(‘test3.txt’,‘w’) do |a\_f|  
a\_f.print data\_all.map{|row| row.join("\t")}.join("\n")  
end

#but for Excel, csv file is better

File.open(‘test3.csv’,‘w’) do |a\_f|  
a\_f.print data\_all.map{|row| row.join(",")}.join("\n")  
end

---

<div class="post-metadata">

**Author:** ![alex-osu3](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@alex-osu3](https://www.ruby-forum.com/u/alex-osu3)\
**Post date:** [October 9, 2009, 5:47pm UTC](https://www.ruby-forum.com/t/write-a-file/176953/7 "2009-10-09T17:47:14Z")

</div>

Thairuby TH wrote:

> #I try to shorten it
> 
> File.open(‘test3.txt’,‘w’) do |a\_f|  
> a\_f.print data\_all.map{|row| row.join("\t")}.join("\n")  
> end
> 
> #but for Excel, csv file is better
> 
> File.open(‘test3.csv’,‘w’) do |a\_f|  
> a\_f.print data\_all.map{|row| row.join(",")}.join("\n")  
> end

Thank you very much for the code. But I still like to do the format  
after file  
is read by Excel.

Li
