تحويل الصفوف متفاوتة إلى أعمدة مع FasterCSV
سؤال
ولدي ملف البيانات CSV مع الصفوف التي قد يكون لها الكثير من الأعمدة 500+ وبعض مع أقل كثيرا. أنا بحاجة إلى تبديل بحيث يصبح كل صف عمود في ملف الإخراج. والمشكلة هي أن الصفوف في الملف الأصلي قد لا يكون كل نفس العدد من الأعمدة بحيث عندما أحاول طريقة تبديل لمجموعة أحصل على:
<اقتباس فقرة>و`تبديل ': يختلف حجم العنصر (يجب أن يكون 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]]
لا تنتمي إلى StackOverflow