【发布时间】:2019-06-11 19:31:07
【问题描述】:
我正在尝试解析多个 XML 文件,然后将它们输出到 CSV 文件中以列出正确的行和列。
我能够通过定义文件名一次处理一个文件来做到这一点,并将它们专门输出到定义的输出文件名中:
File.open('H:/output/xmloutput.csv','w')
我想写入多个文件并使它们的名称与 XML 文件名相同,而无需对其进行硬编码。我尝试了多种方法,但到目前为止都没有运气。
示例 XML:
<?xml version="1.0" encoding="UTF-8"?>
<record:root>
<record:Dataload_Request>
<record:name>Bob Chuck</record:name>
<record:Address_Data>
<record:Street_Address>123 Main St</record:Street_Address>
<record:Postal_Code>12345</record:Postal_Code>
</record:Address_Data>
<record:Age>45</record:Age>
</record:Dataload_Request>
</record:root>
这是我尝试过的:
require 'nokogiri'
require 'set'
files = ''
input_folder = "H:/input"
output_folder = "H:/output"
if input_folder[input_folder.length-1,1] == '/'
input_folder = input_folder[0,input_folder.length-1]
end
if output_folder[output_folder.length-1,1] != '/'
output_folder = output_folder + '/'
end
files = Dir[input_folder + '/*.xml'].sort_by{ |f| File.mtime(f)}
file = File.read(input_folder + '/' + files)
doc = Nokogiri::XML(file)
record = {} # hashes
keys = Set.new
records = [] # array
csv = ""
doc.traverse do |node|
value = node.text.gsub(/\n +/, '')
if node.name != "text" # skip these nodes: if class isnt text then skip
if value.length > 0 # skip empty nodes
key = node.name.gsub(/wd:/,'').to_sym
if key == :Dataload_Request && !record.empty?
records << record
record = {}
elsif key[/^root$|^document$/]
# neglect these keys
else
key = node.name.gsub(/wd:/,'').to_sym
# in case our value is html instead of text
record[key] = Nokogiri::HTML.parse(value).text
# add to our key set only if not already in the set
keys << key
end
end
end
end
# build our csv
File.open('H:/output/.*csv', 'w') do |file|
file.puts %Q{"#{keys.to_a.join('","')}"}
records.each do |record|
keys.each do |key|
file.write %Q{"#{record[key]}",}
end
file.write "\n"
end
print ''
print 'output files ready!'
print ''
end
我收到了'read memory': no implicit conversion of Array into String (TypeError) 和其他错误。
【问题讨论】:
-
您可以发布一个 yaml 文件的小样本作为示例吗?
-
对不起,我不知道如何制作。关于如何编码的任何快速指导?还是您想要 xml 数据的样本?
-
哦,是的,我的意思是 xml
-
请看上面的xml示例
-
没有必要,甚至不希望警告我们您没有编写代码的经验。相反,请完成“How to Ask”及其链接页面以及“mcve”中描述的作业。花点时间完成这些步骤,然后向我们提供所需的信息,我们会尽力为您提供帮助。
标签: ruby xml csv nokogiri export-to-csv