我正在将我在 python 中创建的一组文件(将元数据/xml 记录转换为文本)中的一些文本数据导入到 excel 中。除了在文本只是在段落中的点处插入新行之外,它大部分工作正常。这是文件创建过程中的一个问题。
是否可以自动清理数据以将数据保留在同一行中,直到遇到转义/新字符?
由于该站点不允许附件,因此我在此处附上了示例。
- anz*_log.txt -- 我使用“^”作为分隔符的原始文本文件。如果excel可以使用它仅在存在时创建新行,我可以强制它在每个已知行的末尾添加另一个字符。
- anz*_xml.xls Excel 导入 - 工作表 (*log) 原始导入数据)并清理了我使用公式正确获取值的位置。
- rowChar_anz*log.txt - 原始文本文件,每行开头带有 ':;:' 以表明它应该是一个新行(与 1 相同,但行有额外的分隔符)
这只是在测试数据集上,我需要在 1000 个文件上运行它。请参阅第 9、13、54 行等中的问题。
我可以使用 python(或者如果需要 cygwing/SED)来
- 查找“行首”字符串 - ':;:' 和“行尾”字符串 ';:;'
- 如果两者都不存在于一行中,则将行附加到上一行
或者(理想情况下)可以在使用以下代码创建文件时完成此操作吗?也许使用 re.compile (如查询 CSV 并将原始 CSV 和结果写入单个 CSV Python)?
#-------------------------------------------------------------------------------
# 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
SourceDIR=r'L:\Vector_Data'
rootDir=os.getcwd()
log_name='vector'
x=0
def locatexml(SourceDIR,x, rootDir):
xmllist=[]
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:
processxml(currentFile,x, rootDir)
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 processxml(currentFile,x, rootDir):
from lxml import etree
seperator='^'
with open(currentFile) as f:
tree = etree.parse(f)
xmltaglist=[]
for tagn in tree.iter(tag=None):
#print tagn.tag
xmltaglist.append(tagn.tag)
if 'anzmeta' in str(tree.getroot()):
log=open(rootDir+'\\'+log_name+'anzmeta_xml_log.txt','a')
log.write(':;:'+seperator+str(x)+seperator+currentFile+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)+seperator)
log.write('\n')
log.close
else:
print currentFile+" not an anzlic metadata file...logging seperately"
log=open(rootDir+'\\'+log_name+'non_anzmeta_xml_log.txt','a')
log.write(':;:'+seperator+str(x)+seperator+currentFile+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)+seperator)
log.write('\n')
log.close
locatexml(SourceDIR,x, rootDir)