2016-11-15 13 views
0

私は試したことがあります(ドキュメントを読んで4時間、グーグルグーグル...)、それは私の頭脳でなければならないので、のみ特定の列(例えば1、2、13、15及び17)をプリントアウトし、次いで、(REは^[A-Z][A-Z];.*15%;である)特定の正規表現に一致する行を保つ :Pythonで正規表現のCSVレコードを処理する

私が処理する必要.csvファイルを、得ました。シェル(grep、awk)は非常に簡単で、Pythonでは(私にとっては)不可能です。

これは私がこれまでに思い付いたコードです:私の信念に

import re 
import csv 
src="/Users/username/file.csv" 
reg="^[A-Z][A-Z];.*15%;" 
with open(src, "r") as file: 
    for line in file: 
     line=line.strip() 
     match = re.match(reg,line.strip()) 
     if match: 
      vat=csv.reader(line, delimiter=';') 
      for r in vat: 
       print r[0] 

反して、csvモジュールがレコードとして、各文字ではなく、行全体を解析し、それゆえ出力はフィールドではありません[0]の配列ですが、1文字です。

試合

if match: 
    print line 

場合、私は後に印刷行を追加した場合のラインは私の混乱したがって、正しく印刷されている - なぜcsv.readerはそのように扱っていませんか?

自分の考えを聞くことを楽しみにして - のpythonを知って、解決策は非常に簡単です;-)

PS:ボーナスポイントは、REのマッチングは、I、個々の列に行うことができます。 e。唯一のプロセスライン場合、列1つのマッチ[AZ] [AZ]無視する場合とカラム17試合15% - 次に、印刷カラム1、2、13、15および17

+0

'csv.reader'はあなたが与えたオブジェクトを反復し、それを文字列のリストに分割します。 csv.readerにファイルの代わりに行を入力します。行(文字列)を繰り返し処理すると、文字が_records_として取得されます。ファイルを反復処理すると、行が得られます。 –

答えて

0
with open(src, newline='') as file: 
    r = csv.reader(file, delimiter=';') 
    for line in r: 
     if len(line[0]) ==2 and line[0].isalpha() and line[16]=='15%': 
      print(line) #Or whatever it is you want to do 

本当に必要はなく、r'[a-zA-Z]{2}'なし正規表現

+0

Shoud be: 'line [16] == '15%''(構文エラー)。 「編集は6文字以上でなければならないので、この投稿を直接編集できません」 –

+0

@dr_agon良いキャッチ –

+0

ありがとうPatrick!それは私よりもはるかにエレガントなトリックでした(これはすべて難しいことではありません);-) –