Преобразование неровных строк в столбцы с помощью FasterCSV

StackOverflow https://stackoverflow.com/questions/250789

Вопрос

У меня есть файл данных CSV со строками, в которых может быть много столбцов 500+, а в некоторых - намного меньше. Мне нужно транспонировать его так, чтобы каждая строка становилась столбцом в выходном файле. Проблема в том, что строки в исходном файле могут не иметь одинаковое количество столбцов, поэтому, когда я пытаюсь использовать метод транспонирования массива, я получаю:

  

`transpose ': размер элемента отличается (12 должно быть 5) (IndexError)

Есть ли альтернатива транспонированию, которая работает с неравномерной длиной массива?

Это было полезно?

Решение

Я бы вставил нули, чтобы заполнить дыры в вашей матрице, что-то вроде:

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

Другие советы

# 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]]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top