Ruby - Builder - Попытка преобразовать строки CSV в наборы данных для построения нескольких XML - PullRequest
0 голосов
/ 24 февраля 2012

Вот что я пытаюсь сделать. Мне нужно иметь один CSV с заголовками и несколько строк. Я перебираю заголовки и сохраняю, а затем связываю данные строки с заголовком. Мне нужно иметь возможность перебирать каждую из строк в CSV, чтобы использовать для построения данных XML. Созданный XML-файл затем выгружается в виде XML-файла, и программа запускается в следующей строке в CSV-файле. В каждой строке есть столбец, в котором указано имя файла XML.

Вот что у меня так далеко.

Считать данные из файла CSV. Соберите данные заголовка и строки.

def get_rows
        raw_data = CSV.read('test.csv', {:skip_blanks => false, :headers => true})
        data = []
        raw_data.each { |row| data << row}
        return build_header(data, raw_data)
    end

возьмите данные заголовка и строки и объедините их.

def build_header(data, raw_data)
    (0..(data.length - 1)).each do |ri|
        h = {}
        raw_data.headers.each_with_index do |v, i|
            h[v] = data[ri].fields[i]
        end
        return build_ostruct(h)
    end
end

возьмите хеш h и сделайте из него октрум.

def build_ostruct(h)
    x = OpenStruct.new(h)
    uniq = x.tc_name
    y = uniq_name.to_s + ".xml"
    #marshal dump for debugging
    x.marshal_dump.each{ |k,v| puts "#{k} => #{v}" }
    return xml_builder(x, y)

end

Ниже я беру новую ostruct "x" и вызываю заголовки столбцов из CSV для #population узлов XML

Например: x.column1, x.column2, x.column3

Теперь часть, за которую я зацикливаюсь, - это получение ostruct для получения новой строки данных за цикл итерации. Цель состоит в том, чтобы заполнить ostruct каждой строкой из CSV. В настоящее время хэш отображает правильный набор данных, и мой XML заполняется, как ожидалось, но только с первой строкой данных. Как мне сделать это, чтобы перебрать все строки и заполнить ostruct данными для каждой итерации, чтобы я мог создать большой набор XML?

Заранее спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 22 апреля 2012

Примерно так должно работать:

require 'csv'
require 'nokogiri'

CSV.foreach('test.csv', :headers => true) do |row|
    builder = Nokogiri::XML::Builder.new do |xml|
        xml.root do |root|
            row.each do |k, v|
                root.send k, v
            end
        end
    end
    File.open("#{row['tc_name']}.xml", 'w'){|f| f << builder.to_xml}
end
1 голос
/ 24 февраля 2012

вы звоните return в build_header, что завершает вызов.вам нужно каким-то образом собирать результаты, не возвращая сразу первый, чтобы build_header мог работать для всего набора строк.

...