Pergunta

Eu tenho um arquivo de dados CSV com linhas que podem ter muitas colunas 500+ e alguns com muito menos. Eu preciso transpô-la para que cada linha torna-se uma coluna no arquivo de saída. O problema é que as linhas no arquivo original podem não ter o mesmo número de colunas, então quando eu tentar o método de transposição de matriz eu recebo:

`Transposição ': difere tamanho do elemento (12 deve ser 5) (IndexError)

Existe uma alternativa para transpor que funciona com comprimento de matriz irregular?

Foi útil?

Solução

eu iria inserir valores nulos para preencher os buracos na sua matriz, algo como:

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

Outras dicas

# 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top