Ruby:排序2d数组并将类似的字段值输出到文件

Ruby:排序2d数组并将类似的字段值输出到文件,ruby,excel,Ruby,Excel,我使用以下代码从excel(使用ParseExcel)读取数组: 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

我使用以下代码从excel(使用ParseExcel)读取数组:

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列中具有相同值的所有行打印到一个文件中,以此类推,对于第3列中其他相同值的不同文件

希望我能解释清楚。谢谢你的帮助/提示

附言。
我搜索了这个站点上的大多数帖子,但没有找到任何解决方案。

我没有使用上面的代码,而是制作了一个测试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)

下面是使用块而不是do的相同代码。。完:

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)