我最近收到了很多xml文件,我想在excel中进行分析。我不想在(较新版本的)excel中使用xml转换标准,而是希望使用Ruby代码自动为大量文件执行此操作。
然而,我对rexml并不是很熟悉。经过半天的工作,我得到了只转换一个(!)xml节点的代码。这是它的外观:
require 'rexml/document'
Dir.glob("FILES/archive/*.xml") do |eksemel|
puts "converting #{eksemel}"
filename = (/\d+/.match(eksemel)).to_s
xml_file = File.open("#{eksemel}", "r")
csv_file = File.new("#{filename}.csv", "w")
xml = REXML::Document.new( xml_file )
counter = 0
xml.elements.each("RESULTS") do |e|
e.elements.each("component") do |f|
f.elements.each("paragraph") do |g|
counter = counter + 1
csv_file.puts g.text
end
end
end
end
有没有办法a)而不是定义元素的名称和数字让ruby自动执行,b)将所有这些保存为csv文件中的单独列?
答案 0 :(得分:0)
目前尚不清楚您使用counter
的内容。如果您澄清了XML文件具有哪种结构(例如,每个<paragraph>
元素中有多个<component>
元素?),它也会有所帮助。但是,这是一种更清晰的方式来编写我认为你拍摄的内容:
require 'rexml/document'
require 'csv'
Dir.glob('FILES/archive/*.xml') do |eksemel|
puts "converting #{eksemel}"
# I assume you are creating a .csv file with the same name as your .xml file
xml_file = File.new(eksemel)
csv_file = CSV.open(eksemel.sub(/\.xml$/, '.csv'), 'w')
xml = REXML::Document.new(xml_file)
counter = xml.elements.to_a('RESULTS//component//paragraph').length
xml.elements.each('RESULTS//component') do |component|
csv_file << component.elements.to_a('paragraph')
end
[xml_file, csv_file].each {|f| f.close}
end