# Parsing a file

**URL:** <https://www.ruby-forum.com/t/parsing-a-file/136423>\
**Category:** Ruby\
**Created:** [May 1, 2008, 11:07pm UTC](https://www.ruby-forum.com/t/parsing-a-file/136423 "2008-05-01T23:07:38Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![masiarek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ec9cab/32.png) [@masiarek](https://www.ruby-forum.com/u/masiarek)\
**Post date:** [May 1, 2008, 11:07pm UTC](https://www.ruby-forum.com/t/parsing-a-file/136423/1 "2008-05-01T23:07:38Z")

</div>

Input file format (three columns, tabs delimited):  
A \t X1, X2 \t Z1, Z2  
B \t X3 \t Z3  
C \t X4, X5, X6 \t Z4, Z5, Z6

Expected file format:  
A X1 Z1  
A X2 Z2  
B X3 Z3  
C X4 Z4  
C X5 Z5  
C X6 Z6

My code:  
a = Array.new()  
x = Array.new()  
z = Array.new()  
s = String.new()  
open(“c:\temp\a.txt”).each {|e|  
a = e.split("\t")  
x = a[1].split(",")  
z = a[2].split(",")  
x.each\_index {|i|  
s = a[0] +"\t" + x[i] +" \t" + z[i]  
puts s  
}  
}

Can this be done in a more elegant manner?

---

<div class="post-metadata">

**Author:** ![masiarek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ec9cab/32.png) [@masiarek](https://www.ruby-forum.com/u/masiarek)\
**Post date:** [May 1, 2008, 11:26pm UTC](https://www.ruby-forum.com/t/parsing-a-file/136423/2 "2008-05-01T23:26:07Z")

</div>

On Thu, May 1, 2008 at 11:07 PM, Adam M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> C X5 Z5  
> z = a[2].split(“,”)  
> x.each\_index {|i|  
> s = a[0] +“\t” + x[i] +" \t" + z[i]  
> puts s  
> }  
> }
> 
> Can this be done in a more elegant manner?

The approach is OK, these are mostly cosmetic touches:

input = \<\<EOS  
A\tX1, X2\tZ1, Z2  
B\tX3\tZ3  
C\tX4, X5, X6\tZ4, Z5, Z6  
EOS

input.each do |line|  
key, xs, zs = line.chomp.split(“\t”)  
xs = xs.split(/\s\*,\s\*/)  
zs = zs.split(/\s\*,\s\*/)  
xs.zip(zs) {|x, z| puts [key, x, z].join(“\t”)}  
end

---

<div class="post-metadata">

**Author:** ![masiarek](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ec9cab/32.png) [@masiarek](https://www.ruby-forum.com/u/masiarek)\
**Post date:** [May 2, 2008, 4:25am UTC](https://www.ruby-forum.com/t/parsing-a-file/136423/3 "2008-05-02T04:25:42Z")

</div>

On May 1, 4:07 pm, Adam M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> C X5 Z5  
> z = a[2].split(“,”)  
> x.each\_index {|i|  
> s = a[0] +“\t” + x[i] +" \t" + z[i]  
> puts s  
> }
> 
> }
> 
> Can this be done in a more elegant manner?

IO.foreach(“data”){|line|  
k, \*vals = line.split( “\t” )  
vals.map{|x| x.split( “,” )}.transpose.each{|x|  
puts [k, \*x].join( “\t” ) }  
}
