Frage

Ich habe eine CSV-Datei mit Zeilen, die viele Spalten 500+ und einige mit viel weniger haben. Ich brauche es umzusetzen, so daß jede Zeile eine Spalte in der Ausgabedatei wird. Das Problem ist, dass die Zeilen in der ursprünglichen Datei möglicherweise nicht alle die gleiche Anzahl von Spalten haben so, wenn ich die Transponierung Methode der Array versuche ich bekommen:

  

`transponieren ': Elementgröße unterscheidet sich (12 5 sein sollte) (Indexerror)

Gibt es eine Alternative zu transponieren, die mit unebener Feldlänge funktioniert?

War es hilfreich?

Lösung

Ich würde einfügen nulls die Löcher in der Matrix, etwas wie zu füllen:

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

Andere Tipps

# 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]]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top