1

csv を xml から csv に変換するプログラムがあります。しかし、それをcsvに戻すと、フォーマットが間違っています。もともと csv ファイルは次のようになっています。

x1    y1    z1    x2    y2    z2    cost
 1     2     3     4     5     6       7

などなど。このデータもエクセルで表現しています。次に、これを次のように xml に変換します。

<Solution version="1.0">
  <DrillHoles total_holes="238">
    <description>
      <hole hole_id="1">
        <collar>1, 2, 3</collar>
        <toe>4, 5, 6</toe>
        <cost>7</cost>
      </hole>

*これは全体の一部にすぎませんが、この例では十分です。SOこれをcsv形式に戻すと、次のようになります。

 x1    y1     z1    x2    y2    z2    cost
123                 456               7

x1y1z1x2y2z2cost は、Excel の 1 つの列に乱雑になっています。これもエクセルで表現。

xml を生成するための私のコードは次のとおりです。

def generate_xml(reader,outfile):
    root = Element('Solution')
    root.set('version','1.0')
    tree = ElementTree(root)        
    head = SubElement(root, 'DrillHoles')
    description = SubElement(head,'description')
    current_group = None
    i = 1
    for row in reader.next():
        x1,y1,z1,x2,y2,z2,cost = row
        if current_group is None or i != current_group.text:
            current_group = SubElement(description, 'hole',{'hole_id':"%s"%i})

            collar = SubElement(current_group,'collar')
            toe = SubElement(current_group,'toe')
            cost1 = SubElement(current_group,'cost')
            collar.text = ', '.join((x1,y1,z1))
            toe.text = ', '.join((x2,y2,z2))
            cost1.text = cost
        i+=1
    head.set('total_holes', '%s'%i)
    indent.indent(root)
    tree.write(outfile)

csv の生成: def generate_csv(root, outfile): with open(outfile, 'w') as file_:

        writer = csv.writer(file_, delimiter="\t")
        writer.writerow(['x1'] + ['y1'] + ['z1'] + ['x2'] + ['y2'] + ['z2'] + ['cost'])
        for a in zip(root.findall("DrillHoles/description/hole/collar"),
                 root.findall("DrillHoles/description/hole/toe"),
                 root.findall("DrillHoles/description/hole/cost")):
            writer.writerow([x.text for x in a])

編集に感謝します。複数の区切り記号が必要になると思いますが、それをこのプログラムに組み込む方法がわかりません。

4

2 に答える 2

1

xml を生成するときに行う join((x1,y1,z1)) と対称な分割が欠落しているようです。このようなもの:

for a in zip(root.findall("DrillHoles/description/hole/collar"),
         root.findall("DrillHoles/description/hole/toe"),
         root.findall("DrillHoles/description/hole/cost")):
    collars, toes, cost = a
    collars = [x.strip() for x in collars.text.split(',')]
    toes = [x.strip() for x in toes.text.split(',')]
    cost = [cost.text]
    writer.writerow(collars + toes + cost)
于 2013-07-08T22:42:45.713 に答える