【发布时间】:2013-10-07 02:13:25
【问题描述】:
我有一些需要解析的 .csv 文件,但我被困在一个需要在不同行中分隔的部分。说清楚:
- 其中一部分是,如果一个键的值为 Y,它应该检查文件具有的类别数 [Works now]
这是示例 csv:
004 000000,Y
005 000000,N
006 000000,N
007 A000000,Y
007 B000000,16
007 C010100,1
007 C020100,XTF ADVISORS TRUST - ETF 2010 PORTFOLIO
007 C030100,Y
007 C010200,2
007 C020200,XTF ADVISORS TRUST - ETF 2015 PORTFOLIO
007 C030200,Y
007 C010300,3
007 C020300,XTF ADVISORS TRUST - ETF 2020 PORTFOLIO
007 C030300,Y
007 C010400,4
007 C020400,XTF ADVISORS TRUST - ETF 2025 PORTFOLIO
007 C030400,Y
007 C010500,5
007 C020500,XTF ADVISORS TRUST - ETF 2030 PORTFOLIO
007 C030500,Y
007 C010600,6
这部分的 Python 代码返回部分的数量和与007 A000000 相关的行是:
def haveSeries(csvfile):
with open(csvfile, 'rb') as f:
reader = csv.reader(f)
row2 = 0
for row in reader:
if (row[0] == '007 A000000') and (row[1]=='Y'):
baseline = reader.line_num
print baseline
seriesnum = reader.next()
print seriesnum[1]
return (baseline,seriesnum[1])
上面的例子返回 16,所以我们有 16 个类别。所以现在我应该制作另一个 csv,在所有行中包含所有 [Key, Values] 到 [007 A000000,Y],并且在每行的下一列中包含与类别编号相关的数据。
类别在键中编号,例如
086 D020000,0
086 E010000,0
086 E020000,0
086 F010000,0
086 F020000,0
024 000100,N
025 D000101,0
025 D000102,0
025 D000103,0
025 D000104,0
025 D000105,0
025 D000106,0
025 D000107,0
***... Category 1 starts at 024 000100 ...***
075 A000100,0
075 B000100,0
076 000100,0.00
024 000200,N
025 D000201,0
025 D000202,0
025 D000203,0
025 D000204,0
025 D000205,0
***... category 2 starts at 024 000200... and so on***
所以识别这些的正则表达式类似于\d{3}( \w| )\d{3}X\d.{,},对于 X,我必须迭代 1 到 16 并且每个类别有不同的行。
我为此部分编写的代码:
if haveSeries(csvfile) != False:
seriesBaseNNum=haveSeries(csvfile)
# TODO write all the lines from 1 to baseline again
for row in reader:
for i in xrange(1,int(seriesBaseNNum[1])):
i= u'%02d' % i # two digits
seriesi = re.compile ("\d{3}( \w| )\d{3}%s\d.{,}" % i) #err on %d so changed to %s
matchers = seriesi.search(row[0])
if matchers:
print matchers.**group(0)**
但我得到这样的输出:
074 T000100
074 U010100
074 U020100
074 V010100
074 V020100
074 W000100
074 X000100
074 Y000100
075 A000100
075 B000100
076 000100
024 001100
025 D001101
025 D001102
025 D001103
025 D001104
025 D001105
025 D001106
025 D001107
025 D001108
028 A011100
028 A021100
028 A031100
028 A041100
028 B011100
028 B021100
028 B031100
028 B041100
028 C011100
028 C021100
...
所以它只在 i=1 上迭代一次(碰巧 i=11,我的意思是当 %s 为 1 并且它之前的字符也为 1 时)
- 如何在 Regex 上进行迭代以在此示例中找到 i=1 到 16 的所有匹配项?
- 我应该如何实现必须为所有类别写入前 n 列并将其余部分写入每行的下一个列的部分?
【问题讨论】:
-
您好,我编辑了您的问题,以便在 csv 样本中更好地阅读。你能检查一下这是否是你最初的意图吗?
-
我猜我的下一行字符不见了;)谢谢杰瑞