2008-10-30 6 views
4

J'ai un fichier de données CSV avec des lignes qui peuvent avoir beaucoup de colonnes 500+ et certaines avec beaucoup moins. J'ai besoin de le transposer de sorte que chaque ligne devienne une colonne dans le fichier de sortie. Le problème est que les lignes dans le fichier d'origine ne peuvent pas tous avoir le même nombre de colonnes quand j'essaie la méthode de transposition du tableau je reçois:Conversion de lignes irrégulières en colonnes avec FasterCSV

`Transpose ': 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 réseau inégale?

+1

homme, qui est doux que Ruby a construit dans des tableaux transpose. J'ai généralement écrit un script pour le faire dans d'autres langues. – wprl

Répondre

9

J'insérerais nulls pour remplir les trous dans votre matrice, quelque chose comme:

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

Terminé en utilisant cette solution. Merci – srboisvert

2
# 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]] 
Questions connexes