Losing values upon converting object to Array

Hi All,

Not sure if i am doing this correctly. I am reading a xlsx file and then
extracting few columns and want to save them in a csv. So below is what
i am doing:

workbook = Roo::Excelx.new("#{@file}")
workbook.default_sheet="#{@sheet}"
7.upto(workbook.last_row) do |line|
@col1 = Array(devstatus = workbook.cell(line, ‘H’))
@col2 = Array(availabletesting = workbook.cell(line,‘Y’))
@col3 = Array(firstroundstatus = workbook.cell(line,‘AB’))
@col4 = Array(secondroundstatus = workbook.cell(line,‘AH’))
@col5 = Array(thirdroundstatus = workbook.cell(line,‘AL’))
end

CSV.open(“test.csv”,‘w’) do |writer|
writer << [@col1,@col2,@col3,@col4,@col5]
end

When i run the above, the csv file generated but its empty. But when i
print the following:

puts @col1.class == Array #Outputs true, so i suppose my conversion to
array is done correctly
puts @col1.length #Shows me that array length as 0

But when i do: puts @col1 - I get to see all the elements in the array.

Any idea whats wrong?

Thanks

The loop goes through all the rows, and then you write to the CSV so you
are only writing the last row, which may be empty?

In the loop, you are creating a new array containing a single value,for
each row/col
Not clear from the code if you really need the assignment either, seems
redundant.
In any case this is what I think it should be:

workbook = Roo::Excelx.new("#{@file}")
workbook.default_sheet="#{@sheet}"
CSV.open(“test.csv”,‘w’) do |writer|
7.upto(workbook.last_row) do |line|
@col1 = (devstatus = workbook.cell(line, ‘H’))
@col2 = (availabletesting = workbook.cell(line,‘Y’))
@col3 = (firstroundstatus = workbook.cell(line,‘AB’))
@col4 = (secondroundstatus = workbook.cell(line,‘AH’))
@col5 = (thirdroundstatus = workbook.cell(line,‘AL’))
writer << [@col1,@col2,@col3,@col4,@col5]
end
end

I don’t have Ruby at work so this is just an educated guess :wink:

Chris H. wrote in post #1117068:

The loop goes through all the rows, and then you write to the CSV so you
are only writing the last row, which may be empty?

In the loop, you are creating a new array containing a single value,for
each row/col
Not clear from the code if you really need the assignment either, seems
redundant.
In any case this is what I think it should be:

workbook = Roo::Excelx.new("#{@file}")
workbook.default_sheet="#{@sheet}"
CSV.open(“test.csv”,‘w’) do |writer|
7.upto(workbook.last_row) do |line|
@col1 = (devstatus = workbook.cell(line, ‘H’))
@col2 = (availabletesting = workbook.cell(line,‘Y’))
@col3 = (firstroundstatus = workbook.cell(line,‘AB’))
@col4 = (secondroundstatus = workbook.cell(line,‘AH’))
@col5 = (thirdroundstatus = workbook.cell(line,‘AL’))
writer << [@col1,@col2,@col3,@col4,@col5]
end
end

I don’t have Ruby at work so this is just an educated guess :wink:

Hi Chris,

Thanks for the help. Yes, it was the incorrect csv loop. Issue resolved.

Thanks