Pregunta

Tengo un archivo de datos CSV con filas que pueden tener muchas columnas 500+ y algunas con menos. Necesito transponerlo para que cada fila se convierta en una columna en el archivo de salida. El problema es que es posible que no todas las filas del archivo original tengan el mismo número de columnas, de modo que cuando intento el método de transposición de matriz, obtengo:

  

`transpose ': el tamaño del elemento difiere (12 debería ser 5) (IndexError)

¿Existe una alternativa a la transposición que funcione con una longitud de matriz desigual?

¿Fue útil?

Solución

Insertaría nulos para rellenar los orificios de la matriz, por ejemplo:

a = [[1, 2, 3], [3, 4]]

# This would throw the error you're talking about
# a.transpose

# Largest row
size = a.max { |r1, r2| r1.size <=> r2.size }.size

# Enlarge matrix inserting nils as needed
a.each { |r| r[size - 1] ||= nil }

# So now a == [[1, 2, 3], [3, 4, nil]]
aa = a.transpose

# aa == [[1, 3], [2, 4], [3, nil]]

Otros consejos

# Intitial CSV table data
csv_data = [ [1,2,3,4,5], [10,20,30,40], [100,200] ]

# Finding max length of rows
row_length = csv_data.map(&:length).max

# Inserting nil to the end of each row
csv_data.map do |row|
  (row_length - row.length).times { row.insert(-1, nil) }
end

# Let's check
csv_data
# => [[1, 2, 3, 4, 5], [10, 20, 30, 40, nil], [100, 200, nil, nil, nil]]

# Transposing...
transposed_csv_data = csv_data.transpose

# Hooray!
# => [[1, 10, 100], [2, 20, 200], [3, 30, nil], [4, 40, nil], [5, nil, nil]]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top