将单列拆分为两列

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

这里的问题是每个名称下方的数据(某些数据?)数量不同且未知。我唯一能使用的部分是前导字符###,表示新名称的开始。 某些数据?是一个单词。如何完成这项任务?
5个回答

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)

这会在第一行多一个换行符,但如果你真的想要去掉它,那很容易去掉。

使用 x.strip('#') 替代 .replace() :-) - Martijn Pieters

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

看起来在 Mac 上的 awk 不支持三元运算符 ? :,所以请使用这个适用于 Mac 的版本:

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

你确定这个能正常工作吗?它给我抛出了一个错误,说 源代码的第一行有语法错误... /^#/{gsub(/#/,"");printf "%s",NR!= - 0x0
1
你所在的平台和 awk 版本是什么?可以确定的话,可以在这里查看 http://ideone.com/5Ca8za。 - Chris Seymour
$awk -version 输出 awk 版本 20070501。它仍然给我相同的错误。 - 0x0
你似乎使用的是旧/损坏的awk,你在使用Solaris吗?你需要使用/usr/xpg4/bin/awk - Chris Seymour
这非常奇怪。我使用的是macOSX 10.8.3。 - 0x0
1
@Sunil 很有趣,我登录了一台 Mac 机器,它不喜欢三元运算符,我已经添加了一个 Mac 友好的答案,但我建议你安装 GNU awk :] - Chris Seymour

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
组之间不要用空行分隔。 - Chris Seymour
@sunil 然后只需添加一个 print - 目前正在使用移动设备,无法编辑帖子。 - Jon Clements

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

0

你可以使用 re.split 轻松分割数据

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

然后您会得到一个名称数组,后面跟着相关的数据。 然后您可以解析每个名称的数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接