def Dvector.fancy_read(stream, cols = nil, opts = {})
if stream.is_a?(String)
stream = File.open(stream)
end
raise ArgumentError.new("'stream' should have a gets method") unless
stream.respond_to? :gets
o = FANCY_READ_DEFAULTS.merge(opts)
while o["skip_first"] > 0
stream.gets
o["skip_first"] -= 1
end
columns = []
line_number = 0
while line = stream.gets
next if line =~ o["comments"]
next if line =~ /^\s*$/
if o["remove_space"]
line.gsub!(/^\s+/,'')
end
elements = line.split(o["sep"])
numbers = elements.collect do |s|
begin
a = Float(s)
rescue
o["default"]
end
end
if numbers.size < columns.size
while numbers.size < columns.size
numbers << o["default"]
end
else
while columns.size < numbers.size
columns << Dvector.new(line_number, o["default"])
end
end
columns.size.times do |i|
columns[i] << numbers[i]
end
line_number += 1
end
if o["index_col"]
columns.unshift(Dvector.new(columns[0].length) { |i| i})
end
return columns unless cols
return cols.collect { |i|
columns[i]
}
end