2011-03-24 27 views
0

我有陣列我使用以下代碼(使用ParseExcel的)從Excel讀:紅寶石:排序2D陣列和輸出類似字段值到文件

workbook = Spreadsheet::ParseExcel.parse("test.xls") 
rows = workbook.worksheet(1).map() { |r| r }.compact 
grid = rows.map() { |r| r.map() { |c| c.to_s('latin1') unless c.nil?}.compact rescue nil } 
grid.sort_by { |k| k[2]} 

TEST.XLS擁有大量行和6列的。上面的代碼按列3排序。

我想輸出行數組「grid」到許多文本文件中,如下所示: - 排序後,我想打印出列3具有相同值的所有行放入一個文件,依此類推,爲另一個不同的文件提供第三列中的其他相同值。

希望我解釋一下這個權利。感謝您的任何幫助/提示。

ps。 我通過本網站上的大多數發佈進行搜索,但找不到任何解決方案。

回答

0

而不是使用你的上面的代碼,我做了一個測試100行數組,每行包含一個6元素的數組。

你傳入數組和你想要匹配的列號,並且這個方法打印到具有相同第n個元素的單獨文件行中。

由於我使用整數,我使用每行的第n個元素作爲文件名。如果您的第n個元素沒有創建好文件名,您可以使用計數器或元素的md5或類似的東西。

a = [] 
100.times do 
b = [] 
    6.times do 
    b.push rand(10) 
    end 
    a.push(b) 
end 

def print_files(a, column) 

    h = Hash.new 
    a.each do |element| 
    h[element[2]] ? (h[element[column]] = h[element[column]].push(element)) : (h[element[column]] = [element]) 
    end 

    h.each do |k, v| 
    File.open("output/" + k.to_s, 'w') do |f| 
     v.each do |line| 
     f.puts line.join(", ") 
     end 
    end 
    end 
end 

print_files(a, 2) 
+0

該解決方案的工作。感謝您的幫助。 – rubydoo 2011-03-25 15:55:49

0

下面是使用塊,而不是做..結束相同的代碼:

a = Array.new 
100.times{b = Array.new;6.times{b.push rand(10)};a.push(b)} 

def print_files(a, column) 
    h = Hash.new 
    a.each{|element| h[element[2]] ? (h[element[column]] = h[element[column]].push(element)) : (h[element[column]] = [element])} 
    h.map{|k, v| File.open("output/" + k.to_s, 'w'){|f| v.map{|line| f.puts line.join(", ")}}} 
end 

print_files(a, 2)