Larme
4/21/2007 7:39:00 PM
On Apr 22, 3:25 am, Robert Klemme <shortcut...@googlemail.com> wrote:
> On 21.04.2007 20:16, Larme wrote:
>
>
>
> > Dear all, I'm a newbie to ruby and today when I'm writing a simple
> > script to process some data, I found something I can't understand.
>
> > The data is stored in several column seperated by tab or space. I use
> > the following code to get the data (assuming the data comes from
> > standard input and all numbers are integer)
>
> > data=[]
> > counter = 0
> > while line = STDIN.gets
> > data[counter] = line.split
> > data[counter].map! {|str| str.to_i}
> > counter += 1
> > end
>
> > hence data[i] is an array hold all the numbers in the ith line, data[i]
> > [j] is the number on ith line and jth column. Then what I want the
> > script to do is sorting lines according to a specified column. I
> > thought the following code should work:
>
> > result = data.sort {|x, y| x[col] <=> y[col] }
>
> > where the col determine which column the script will sort according
> > to. However ruby raise a error saying:
> > "undefined method `<=>' for nil:NilClass (NoMethodError)
> > from ana.rb:16:in `sort'
> > from ana.rb:16
> > "
>
> > I have to write the code as
>
> > result = data.sort {|x, y| x[col].to_i <=> y[col].to_i }
>
> > to let the script run properly. I'm quite confused here. I think the
> > elements of array data are converted to integer when the code
>
> > data[counter].map! {|str| str.to_i}
>
> > finished. However why ruby still requires a explicit conversion when I
> > use the data.sort?
>
> You probably have lines with differing number of entries and thus
> sometimes x[col] just returns nil.
>
> You could do something like:
>
> data.sort_by {|x| x[col].to_i}
> data.sort_by {|x| x[col] || 0}
>
> If you want to be sure that you extract only integers you could do
>
> l.scan(/\d+/).map {|x| x.to_i}
>
> instead of the split.
>
> Lots of options...
>
> Kind regards
>
> robert
Thank all of you. Yes, the problem is that the column number is not
fixed -- it should be, but my friend who prepare the data made some
thing wrong.