这就是我想要完成的事情。我需要一个包含标题和多行的CSV。我正在遍历标题并存储然后将行数据与标题相关联。我需要能够遍历CSV中的每一行以用于构造XML的数据。然后将构造的XML转储为.xml文件,程序在CSV的下一行开始。每行都有一列提供XML文件的名称。
这是我到目前为止所得到的。
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
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在每次迭代运行时接收新的数据行。目标是让ostruct填充CSV中的每一行。目前,哈希显示正确的数据集,我的XML按预期填充,但仅限于第一行数据。我如何让它遍历所有行并使用每次迭代的数据填充ostruct,这样我就可以创建一个批量的XML集?
提前感谢您提供的任何帮助!
答案 0 :(得分: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 :(得分:1)
您在return
中呼叫build_header
,结束通话。您需要以某种方式收集结果而不立即返回第一个结果,以便build_header
可以针对整个行集运行。