2013-04-08 82 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