Ruby: сортировка 2d массива и вывод аналогичного значения поля для файлов - PullRequest
0 голосов
/ 25 марта 2011

У меня есть массив, который я читаю из 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.

Надеюсь, я объясню это правильно.Спасибо за любую помощь / советы.

пс.Я просматриваю большинство сообщений на этом сайте, но не могу найти никакого решения.

Ответы [ 2 ]

0 голосов
/ 26 марта 2011

Здесь тот же код, использующий блоки вместо do .. end:

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)
0 голосов
/ 25 марта 2011

вместо того, чтобы использовать приведенный выше код, я создал тестовый массив из 100 строк, каждая строка содержит массив из 6 элементов.

Вы передаете массив и номер столбца, который вы хотите сопоставить, и этот метод печатает в отдельных файлах строки, имеющие один и тот же элемент n-й.

Поскольку я использовал целые числа, я использовал n-й элемент каждой строки в качестве имени файла. Вы можете использовать счетчик, или md5 элемента, или что-то в этом роде, если ваш n-й элемент не создает хорошего имени файла.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...