سؤال

ولدي ملف البيانات 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]]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top