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

Проблема здесь количество данных (somedata ?) под каждым именем отличается и не известно. Единственный элемент, с которым я должен работать, - это ведущие символы ###, которые означают начало нового имени.

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()' :-) –

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 

кажется awk на Mac не поддерживает тройной оператор ? : поэтому используйте эту Mac дружественную версию вместо:

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

Вы уверены, что это сработало? Это выдает мне сообщение об ошибке «синтаксическая ошибка в исходной строке 1 .../^ #/{gsub (/ # /," "); printf >>>"% s ", NR! = <<<' –

+1

как вы можете быть, см. здесь http://ideone.com/5Ca8za На какой платформе вы работаете и какая версия 'awk' у вас есть? –

+0

'$ awk -version' дает awk-версию 20070501. Он по-прежнему дает мне ту же ошибку. –

0

Вы можете легко разделить ваши данные с re.split

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

Затем вы получите массив имен, за которыми следуют связанные данные. Затем вы можете проанализировать данные для каждого имени.

2

An 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

Группы не разделяются пустой строкой , –

+0

@sudo_O является правильным. –

+0

@sunil, то просто добавьте 'print' - не можете редактировать сообщение, как на мобильном устройстве в mo ' –

Смежные вопросы