简体   繁体   English

使用FasterCSV将不均匀的行转换为列

[英]Converting uneven rows to columns with FasterCSV

I have a CSV data file with rows that may have lots of columns 500+ and some with a lot less. 我有一个CSV数据文件,其行可能有500多列,有些列少了很多。 I need to transpose it so that each row becomes a column in the output file. 我需要转置它,以便每一行成为输出文件中的一列。 The problem is that the rows in the original file may not all have the same number of columns so when I try the transpose method of array I get: 问题是原始文件中的行可能并非都具有相同的列数,所以当我尝试数组的转置方法时,我得到:

`transpose': element size differs (12 should be 5) (IndexError) `transpose':元素大小不同(12应该是5)(IndexError)

Is there an alternative to transpose that works with uneven array length? 是否有替代的转置适用于不均匀的阵列长度?

I would insert nulls to fill the holes in your matrix, something such as: 我会插入空值来填充矩阵中的空洞,例如:

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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM