处理字符串中缺少的数据

时间:2013-11-15 16:11:00

标签: python string csv

假设我有一个长字符串S,它看起来像:

S = "A, 2001, 2003, 2005, A, 2002, A, 2003, 2004, 2005, 2006, A, 2001, 2002, A, 2001, 2006, 2004, A..." 

使用Python,如何获得以下字符串:

"A, 2001, 2003, 2005, , A, 2002, , , , A, 2003, 2004, 2005, 2006, A, 2001, 2002, , , A, 2001, 2006, 2004, , A..." 

我希望“列”(即逗号)的数量等于两个As之间出现的最大年数。

这里的动机是创建一个合理排序的CSV文件。

我想将其分解为一个列表然后循环,如果元素的长度小于4,则在每个元素中添加逗号。

2 个答案:

答案 0 :(得分:1)

首先,将初始字符串拆分为元素,然后创建二维数组并计算最大长度。然后您可以在添加缺少的单元格时将它们合并。类似的东西:

S = "A, 2001, 2003, 2005, A, 2002, A, 2003, 2004, 2005, 2006, A, 2001, 2002, A, 2001, 2006, 2004"

elems = S.split(', ')
lines = []
line = []
length = 0
maxlength = 0
for elem in elems[1:]:
    if 'A' == elem:
        lines.append(line)
        line = []
        if length > maxlength:
            maxlength = length
        length = 0
    else:
        line.append(elem)
        length += 1
lines.append(line)

for line in lines:
    line.extend([''] * (maxlength - len(line)))
    line.insert(0, 'A')

print ','.join(map(lambda x : ','.join(x), lines))

答案 1 :(得分:0)

由于我们不知道开头的最大长度,因此在没有临时存储的情况下你会受到很大压力而无法摆脱2次传球:

s = "A, 2001, 2003, 2005, A, 2002, A, 2003, 2004, 2005, 2006, A, 2001, 2002, A, 2001, 2006, 2004, A..."
parts = s.split('A,')
parts.pop(0) # first is empty
xlen  = max([len(x.split(',')) for x in parts])
for x in parts:
  have  = x.count(',')
  print "A, " + x + (", " * (xl - have - 1))

输出:

A,  2001, 2003, 2005, , 
A,  2002, , , , 
A,  2003, 2004, 2005, 2006, 
A,  2001, 2002, , , 
A,  2001, 2006, 2004, A...,