2012-02-24 3 views
0

これは私が達成しようとしているものです。私はヘッダーといくつかの行を持つ単一のCSVを持つ必要があります。私はヘッダーを繰り返し実行してから、行データをヘッダーに関連付けます。私は、CSVの各行を繰り返して、XMLのデータを構築するために使用できるようにする必要があります。作成されたXMLは.xmlファイルとしてダンプされ、プログラムはCSVの次の行で開始されます。各行には、XMLファイルの名前を示す列があります。Ruby - Builder - いくつかのXMLを構築するためのデータセットとしてCSVの行を変換しようとしています

これまでのところ私はこれを持っています。

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" を取って、例えばXMLノードに

を#populateするCSVから列ヘッダーを呼んでいる:x.column1、x.column2、X。 column3

ここでは、繰り返し処理ごとにデータの新しい行を受け取るようにostructを取得しています。目的は、CSVの各行にオブジェクトを入れることです。現在のところ、ハッシュは適切なデータセットを表示していて、私のXMLは予期されたとおりにデータが取り込まれていますが、データの最初の行のみが埋め込まれています。これをどのようにしてすべての行を繰り返し処理し、繰り返しごとのデータでオブジェクトを作成して、XMLのバルク・セットを作成することができますか?

ご協力いただきありがとうございます!

+0

あなたはcsvファイルのサンプルと希望xml出力を提供してもらえますか?あなたのコードは(少なくともRubyでは)本当にシンプルなものを複雑にするので、それは多くの助けになります。 –

答えて

3

何か作業をする必要があります:

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

簡単な解決策を考える上で私に行きましょう。どうもありがとうございました。 – r3nrut

+0

ようこそ。 – pguardiario

1

returnbuild_headerに呼び出して、コールを終了します。最初のものをすぐに返さずに何らかの方法で結果を収集する必要があるので、build_headerを行セット全体に対して実行することができます。このような

+0

これは問題の一部にすぎません。リターンを取り除いて、それを繰り返す必要がある場合は、XMLを1つだけ取得します。私の問題が本当にどこにあるのか、何とか私は造形を繰り返す必要があります。どのように私はostructとして格納されているものを反復するのですか? – r3nrut

関連する問題