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