0

最近、Excel で分析したい xml ファイルを大量に取得しています。(新しいバージョンの) Excel で xml 変換標準を使用する代わりに、多数のファイルに対して自動的にそれを行う Ruby コードを使用したいと考えています。

ただし、rexml についてはあまり詳しくありません。半日の作業の後、たった 1 つの (!) 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ファイルの個別の列として保存する方法はありますか?

4

1 に答える 1

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
于 2013-11-13T12:34:08.097 に答える