2013-04-08 84 views
3

的数据格式我有如下:拆单柱分成两个

###John### 
someData1 
someData2 
SomeData3 
###Mike### 
someData1 
someData2 
###Ford### 
someData1 
someData2 
SomeData3 
someData4 
someData5 
SomeData6 

我所要的输出是:

John someData1 
     someData2 
     someData3 

Mike someData1 
     someData2 

Ford someData1 
     someData2 
     someData3 
     someData4 
     someData5 
     someData6 

这里的问题是(数据数量some​​data ?)每个名字下面的不同,并且不预先知道。我唯一需要处理的就是领先的###字符,表示新名称的开始。

Somedata?是一个单词。有关如何完成此任何想法?

回答

1

下面给出所需要的精确的输出:

from sys import stdout 

with open('file') as f: 
    for n,line in enumerate(f):   
     if line.startswith('###'):    
      stdout.write(('' if not n else '\n')+line.strip('#\n')) 
     else: 
      stdout.write('\t'+line) 

输出:

John someData1 
     someData2 
     SomeData3 

Mike someData1 
     someData2 

Ford someData1 
     someData2 
     SomeData3 
     someData4 
     someData5 
     SomeData6 
3

我会使用类似:

def fixup(iterable): 
    it = iter(iterable) 
    for x in it: 
     if x.startswith('###'): 
      yield '\n{0}\t{1}'.format(x.strip('#'),next(it)) 
     else: 
      yield '\t{0}'.format(x) 

这会给你的第一行额外的换行符,但很容易被剥离,如果你真的想。

+0

或使用'x.strip( '#')'而不是'.replace()':-) – 2013-04-08 15:25:21

2

AWK是为这个完美的:

$ awk '/^#/{gsub(/#/,"");printf "%s",NR!=1?"\n"$0:$0;next}{print "\t"$0}' file 
John someData1 
     someData2 
     SomeData3 

Mike someData1 
     someData2 

Ford someData1 
     someData2 
     SomeData3 
     someData4 
     someData5 
     SomeData6 

看来awkMac不支持三元运算符? :所以用这个Mac友好而非版本:

$ awk '/^#/{gsub(/#/,"");printf n"%s",$0;n="\n";next}{print "\t"$0}' file 
+0

你确定这有效吗?它引发了一个错误,说源代码行1的语法错误.../^#/ {gsub(/#/,“”); printf >>>“%s”,NR!= <<<' – 2013-04-08 15:50:41

+1

你可以在这里看到http://ideone.com/5Ca8za你有什么平台,你有什么版本的'awk'? – 2013-04-08 16:30:45

+0

'$ awk -version'给awk版本20070501.它仍然给我同样的错误。 – 2013-04-08 19:14:55

0

您可以轻松地分割你带re.split的数据

import re 
namesInfo = re.split('###(.*?)###', dataString) 

然后,您将获得一组名称,然后是关联的数据。 然后,您可以解析每个名称的数据。

2

一种itertools方法:

from itertools import groupby 

with open('yourfile') as fin: 
    for k, g in groupby(fin, lambda L: L.startswith('###')): 
     if k: 
      name = next(g).strip('#\n') 
     else: 
      print '{}\t{}'.format(name, next(g)), 
      for line in g: 
       print '\t{}'.format(line), 
      print 
+2

组不会被空行分隔。 – 2013-04-08 17:22:44

+0

@sudo_O是正确的。 – 2013-04-08 19:12:38

+0

@sunil然后只是添加一个'打印' - 不能编辑帖子,因为在移动的莫' – 2013-04-08 19:15:46