2013-10-17 70 views
0

我想使用Python将普通结构化文本文件转换为CSV格式。Python:将结构化文本解析为CSV格式

输入看起来像这样

[-------- 1 -------] 
Version: 2 
Stream: 5 
Account: A 
[...] 
[------- 2 --------] 
Version: 3 
Stream: 6 
Account: B 
[...] 

输出应该是这个样子:

Version; Stream; Account; [...] 
2; 5; A; [...] 
3; 6; B; [...] 

即输入是由[----<sequence number>----]划分的结构化文本记录,其中包含<key>: <values>-对,输出应该是CSV,每行包含一条记录。

我能够通过

colonseperated = re.compile(' *(.+) *: *(.+) *') 
fixedfields = re.compile('(\d{3} \w{7}) +(.*)') 

以检索的<key>: <values> -pairs成CSV格式 - 但我的结构化文本记录故障识别开始和结束与重新书写为CSV线 - 记录。此外,我希望能够分离不同类型的记录,即区分 - 例如 - Version: 2Version: 3记录类型。

+0

您输入的文件不是* CSV格式;它是结构化的,但不是分隔符分隔的。您的输出*是*。 –

+0

你对不同版本的记录有何期待? –

+0

不同类型的记录具有不同数量的元素。 –

回答

1

阅读列表并不难:

def read_records(iterable): 
    record = {} 
    for line in iterable: 
     if line.startswith('[------'): 
      # new record, yield previous 
      if record: 
       yield record 
      record = {} 
      continue 
     key, value = line.strip().split(':', 1) 
     record[key.strip()] = value.strip() 

    # file done, yield last record 
    if record: 
     yield record 

这从您的输入文件生成字典。

从这里就可以使用csv模块生成CSV输出,特别是csv.DictWriter() class

# List *all* possible keys, in the order the output file should list them 
headers = ('Version', 'Stream', 'Account', ...) 

with open(inputfile) as infile, open(outputfile, 'wb') as outfile: 
    records = read_records(infile) 

    writer = csv.DictWriter(outfile, headers, delimiter=';') 
    writer.writeheader() 

    # and write 
    writer.writerows(records) 

任何标题密钥从记录丢失将离开该列空该记录。任何额外您错过的标题将引发异常;将其添加到headers元组中,或将extrasaction关键字设置为DictWriter()的构造函数为'ignore'

+0

感谢您提供宝贵的解释性提示。我现在有一个工作原型。还有一个问题。使用全部标题(大约100),没有适当的输出只产生一行错误映射的字段:是否对'csv(headers)'有限制? –

+0

不是我所知道的;听起来像别的东西可能是错误的。 –

相关问题