始终对dsv(文本文件)中的列进行排序,其中每个记录具有不同的列顺序

时间:2013-03-08 03:23:18

标签: python database excel

===关于结束问题的评论====

虽然示例中的数据已本地化,但最终脚本对于拥有一组复杂xml文件的人来说非常有用,因为无论归因如何,该过程都可以处理任何输入xml。

===新信息==== 我已经能够在初始过程中生成所有标签的列表,但是然后重新创建标签::文本对是不可行的,因为它必须运行1000的xml,生成一个唯一的排序列表,然后重新读取xml并开始创建文本数据集。

因此,如果给出以下内容(或任何具有唯一分隔符的文本),我可以运行并捕获标记吗?

:;:^1^L:\Vector_Data\Administrative\Boundaries\Federal_Govt\COM_ELB_region.shp_BaseMetadata.xml^citeinfo::None^descript::None^timeperd::None^status::None^distinfo::None^dataqual::None^cntinfo::None^metainfo::None^uniqueid::None^title::COM_ELB_region.shp^origin::None^custod::Tablelands Regional Council ^jurisdic::None^;:;

(在这种情况下,^是列分隔符,::是标签::文本分隔符)

我需要它给我一个标签列表,如[citeinfo,timeprd,status等],然后运行并创建另一个只有文本的数据集。

我将强调这不是本地化的,因为该解决方案适用于任何需要解构的xml。

===原始问题如下

我通过构造许多不同的xml样式文档来创建一个文本文件。我已将tag :: text记录在一起,因为每个文件的标签顺序略有不同。键是原始xml文件的名称。

是否可以从数据中重建excel或'csv',以便所有文件都正确排序列。

可以使用excel示例和原始数据here。我使用的脚本是here

谢谢,

==== 难以从输出中获取标记列表,因为您需要逐行搜索并搜索标记,如果不重复则添加到列表中。所以我决定在解析xml时更容易生成标记列表。这有效但我告诉脚本在xml中找不到有序列表中的标记时会遇到什么问题。请参阅下面的代码。

#-------------------------------------------------------------------------------
# Name:        Convert xml data to csv with anzlic tagged data kept seperate
# Purpose:  Also has an excel template to convert the data into standard columns
#
# Author:      georgec@atgis.com.au
#
# Created:     05/03/2013
# Copyright:   (c) ATGIS. georgec 2013
# Licence:     Creative Commons
#-------------------------------------------------------------------------------

import os, xml, shutil, datetime
from xml.etree import ElementTree as et
from lxml import etree

SourceDIR=r'L:\Data_Admin\XML_CSV_Convertor\test_data'
#SourceDIR=os.getcwd()
rootDir=os.getcwd()
log_name='t2_'
xmllist=[]
xmltaglist=[]
x=0

def locatexml(SourceDIR,x, rootDir, xmllist, xmltaglist):
    for root, dirs, files in os.walk(SourceDIR, topdown=False):
        for fl in files:
            currentFile=os.path.join(root, fl)
            ext=fl[fl.rfind('.')+1:]
            if ext=='xml':
                xmllist.append(currentFile)
                print currentFile
                x+=1
##            try:
                processxmltag(currentFile,x, rootDir, xmltaglist)
##            except:
##                print "Issue with file: "+ currentFile
##                log=open(rootDir+'\\'+log_name+'issue_xml_log.txt','a')
##                log.write(str(x)+'^'+currentFile+'\n')
##                log.close

    print "finished"
    return xmllist, x, currentFile

def processxmltag(currentFile,x, rootDir, xmltaglist):
    from collections import OrderedDict
    with open(currentFile) as f:
        tree = etree.parse(f)
    for tagn in tree.iter(tag=None):
        if tagn.tag not in xmltaglist:
            print tagn.tag
            xmltaglist.append(tagn.tag)
        else:
            print 'tag exists: ' + str(tagn.tag)
    return xmltaglist.sort()

def processxmlfile(xmllist, xmltaglist):
    seperator='^'
    for fl in xmllist:
        with open(fl) as f:
            tree = etree.parse(f)
            if 'anzmeta' in str(tree.getroot()):
                log=open(rootDir+'\\'+log_name+'anzmeta_xml_log.txt','a')
                log.write(':;:'+seperator+str(x)+seperator+fl+seperator)
                print xmltaglist
                for xmltag in xmltaglist:
                    if xmltag not in tree:
                        print str(xmltag)+"::DoesNotExist"
                        log.write(str(xmltag)+"::DoesNotExist"+seperator)
                    for element in tree.iter(xmltag):
                        #print element[x]
                        for child in element.getchildren():
                            print "{0.tag}: {0.text}".format(child)
                            log.write("{0.tag}".format(child)+"::"+"{0.text}".format(child).replace('\n','')+seperator)
                log.write('^;:;\n')
                log.close
            else:
                print fl+" not an anzlic metadata file...logging seperately"
                log=open(rootDir+'\\'+log_name+'non_anzmeta_xml_log.txt','a')
                log.write(':;:'+seperator+str(x)+seperator+fl+seperator)
                for xmltag in xmltaglist:
                    for element in tree.iter(xmltag):
                        #print element[x]
                        for child in element.getchildren():
                            print "{0.tag}: {0.text}".format(child)
                            log.write("{0.tag}".format(child)+"::"+"{0.text}".format(child).replace('\n','')+seperator)
                log.write('^;:;\n')
                log.close


locatexml(SourceDIR,x, rootDir,xmllist, xmltaglist) #run locate xml and process to get sorted list of all tags
processxmlfile (xmllist, xmltaglist)

1 个答案:

答案 0 :(得分:1)

您可以按字母顺序输出标签::文本对。然后,您将保证具有一致的排序,如果所有记录都具有相同的标记集,则它们的顺序将相同。