Question

J'ai un fichier de données CSV avec des lignes qui peuvent avoir beaucoup de colonnes de 500+ et certaines avec beaucoup moins. J'ai besoin de le transposer pour que chaque ligne devienne une colonne dans le fichier de sortie. Le problème est que les lignes du fichier d'origine peuvent ne pas toutes avoir le même nombre de colonnes, donc lorsque j'essaie la méthode de transposition de array, je reçois:

  

`transpose ': la taille de l'élément diffère (12 doit être 5) (IndexError)

Existe-t-il une alternative à la transposition qui fonctionne avec une longueur de tableau inégale?

Était-ce utile?

La solution

Je voudrais insérer des valeurs NULL pour combler les trous de votre matrice, par exemple:

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

Autres conseils

# 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]]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top