[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

parsing a file

Adam Masiarek

5/1/2008 9:08:00 PM

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?
--
Posted via http://www.ruby-....

2 Answers

Xavier Noria

5/1/2008 9:26:00 PM

0

On Thu, May 1, 2008 at 11:07 PM, Adam Masiarek <adam@masiarek.com> wrote:

> 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?

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

William James

5/2/2008 2:21:00 AM

0

On May 1, 4:07 pm, Adam Masiarek <a...@masiarek.com> wrote:
> 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?


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