XML 到 CSV 格式

Posted

技术标签:

【中文标题】XML 到 CSV 格式【英文标题】:XML to CSV formatting 【发布时间】:2013-07-04 11:26:50 【问题描述】:

我有一个将 csv 转换为 xml 到 csv 的程序。但是,当我将其转换回 csv 时,格式出现了错误。原来csv文件是这样的:

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

等等等等。此数据也使用 excel 表示。 然后我将其转换为 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>

*注意这只是整个事情的一部分,但对于这个例子来说已经足够了。 因此,当我将其转换回 csv 格式时,它似乎是这样的:

 x1    y1     z1    x2    y2    z2    cost
123                 456               7

x1y1z1x2y2z2cost 在 excel 的一列中混杂在一起。这也是在 excel 中表示的。

这是我生成 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(根,输出文件): 使用 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])

请帮忙谢谢 编辑:我想我可能需要多个分隔符,但我不知道如何将其合并到这个程序中。

【问题讨论】:

【参考方案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)

【讨论】:

【参考方案2】:

您可以尝试将 excel 方言与 csv writer 类一起使用,以便 excel 正确检测分隔符:

尝试换行:

writer = csv.writer(file_, delimiter="\t")

到这一行:

writer = csv.writer(file_, dialect='excel')

但如果您需要制表符作为分隔符,您可以在 excel 中导入 csv 文件时尝试修剪设置

【讨论】:

以上是关于XML 到 CSV 格式的主要内容,如果未能解决你的问题,请参考以下文章

在c#中将XML文件转换为csv文件格式

目标检测 数据集转换: csv转xml格式

powershell 按级别格式将 xml 转换为 csv(或 excel)

长数转换格式

使用 XSLT 格式问题将 XML 转换为 CSV

如何批量将CSV格式的文件转化成excel格式