0

解析する必要がある .csv ファイルがいくつかあり、別の行に分割する必要がある 1 つの部分で行き詰まりました。明確にするために:

  • 1 つの部分は、1 つのキーの値が 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 のカテゴリがあります。[Key, Values]そのため、すべての行にすべてのレジが[007 A000000,Y]あり、各行の次の列にカテゴリ番号に関連するデータがある別の csv を作成する必要があります。カテゴリは次のようなキーで番号付けされています

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.{,}したがって、これらを識別するための REGEXは、XI が 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で1回だけ反復します(偶然i = 11、つまり、%sが1で、その前の文字も1の場合)

  1. この例で i=1 から 16 のすべての一致を見つけるために正規表現を反復するにはどうすればよいですか?
  2. すべてのカテゴリの最初の n 列を書き込み、残りを各行の次の列に書き込む必要がある部分をどのように実装すればよいですか?
4

2 に答える 2

2

あなたのmatchers変数はMatch Object. ドキュメントに従って、経由で結果にアクセスできますgroup

>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
于 2013-10-01T03:22:37.723 に答える
0

問題は正規表現にあり、条件の行は次のようになっているはずです。

seriesi = re.compile ("\d{3}( \w|  )\d{2}%02d\d{2}.{,}" %i)

次に、1 からカテゴリの数までの for ループで 1 を seriesBaseNNum[0] に書き込み、別の for ループで cvs の各行にカテゴリを書き込みます。

助けてくれてありがとう。

于 2013-10-07T07:05:29.397 に答える