2016-07-19 6 views
0

私は現在Python 2.6を使用しています。私は 'マスター' csvファイルを読み取って、2番目のcsvファイルのエントリーをマスターと照合して妥当性を判断するスクリプトを書く必要があります。マスターとセカンダリのcsvファイルには、それぞれ同じ値の同じ数の列があります。私は、セカンダリcsvファイルの各エントリをループし、マスタcsvのすべてのエントリと照合しようとしています。セカンダリcsvファイルの指定されたエントリがマスタcsvのエントリのいずれかと一致する場合、そのエントリは有効とみなされます。Pythonでマスターcsvファイルに基づいてcsvのエントリを検証する

ID_A,ColumnB,ID_C,ColumnD 
1,text,0,words 
1,text,1,words 
2,text,A,words 
3,text,CC,words 

「ID」の値は、検証プロセスを運転していると「列」の値が補助ある場合:

マスターcsvファイルは次のようになります。まず、このマスターCSVをメモリに入れて、セカンダリCSVのエントリとそれを比較する必要があります。これを行うために、私はcsvを辞書に読み込もうとしました。私は各行をループしましたが、実際に値を印刷する方法しか分かりませんでした。

ColumnA,ColumnB,ID_C,ID_D 
text,words,160,7 
text,words,250,BB 
text,words,1,0 
text,words,15,A 
:代わりにちょうど読んで私はこのようになりますこれは、二次csvファイル内のエントリに対してそれらを比較できるようにメモリに格納する方法を把握する必要があり、これらのファイルを印刷する

with open ('master.csv') as csvfile: 
    masterReader = csv.DictReader(csvfile) 
    for row in masterReader: 
     print(row['ID_A'], row['ID_C']) 

ID_CがマスタID_Aと比較され、ID_DがマスタID_Cと比較されます。最初にmaster-ID_Aに対してテストするのが最善であると思います。なぜなら、そこに一致するものがなければ、master-ID_Cに対してテストするのは無駄だからです。

私はhereと(comparing varied CSV files in python)という別の投稿のメソッドを使ってみましたが、私が望む結果が得られないようでした。

マスターCSVを読み込み、入力ID値に基づいてセカンダリcsvのエントリを検証する2つの別々の関数を持つ1つのクラスを作成したいと思います。私はまた、スクリプトが複数のデータセットで使用できるように入力マスター(同じフォーマットで)とセカンダリcsvを変更できるようにしたい。セカンダリエントリが有効になったら、(ID_C、ID_D、有効)を見たいと思います。

私はこれが意味をなさないことを願っています。私はそれを徹夜でしてきました。ここで何かを明確にすることができたら教えてください

答えて

0

あなたの2つの問題の部分を見てください。
マスタをメモリに読み込みます。

with open('master.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    master = {row['ID_A']: row for row in reader} 

そして再びガードでリストの内包を使用して、このマスターリストに対して二次csvファイルを比較するためにどのように第二の問題は、次のとおりです。例えば、リーダーにrow['ID_A']のキーで全体のマスターファイルを辞書理解を使用してください非常に単純:

with open('secondary.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    result = [(row['ID_C'], row['ID_D'], 'Valid') for row in reader 
       if row['ID_C'] in master and master['ID_C']['ID_C'] == row['ID_D']] 

master辞書キー(ID_A)が一致していることをガードチェックID_Cと鍵がID_Dおよびこれらの両方がある場合にのみTrue、それにmaster:ID_C ==をチェック存在する場合リスト。 resultをプリントアウト

は、マスターリストからID_AID_Cに一致するすべてのID_CID_Dの一覧が表示されます。

読者がこれらをクラスに入れる練習として残しておきます。

0

あなたは(ID_A, ID_C)タプルの集合にマスターファイルを読んで、あなたが検証しているときタプル(ID_C, ID_C)がそこに存在するかどうかだけをチェックできます。

import csv 

class Validator(object): 
    def read_master(self, master): 
     with open(master) as f: 
      reader = csv.DictReader(f) 
      self.master = set((row['ID_A'], row['ID_C']) for row in reader) 

    def validate(self, csv_file): 
     with open(csv_file) as f: 
      reader = csv.DictReader(f) 
      keys = ((row['ID_C'], row['ID_D']) for row in reader) 
      return [list(key) + [key in self.master] for key in keys] 

    def validate_key(self, id_c, id_d): 
     return (id_c, id_d) in self.master 

使用法:

from pprint import pprint 
v = Validator() 
v.read_master('master.csv') 
pprint(v.validate('other.csv')) 
print v.validate_key('1', '1') 
print v.validate_key('1', '2') 

出力:

[['160', '7', False], 
['250', 'BB', False], 
['1', '0', True], 
['15', 'A', False]] 
True 
False 
+0

すばらしい答えに感謝します。私は、第2の機能を微調整する方法について質問します。セカンダリcsvを入力してすべてのエントリを検証するのではなく、単に個別の値 'ID_C'と 'ID_D'を渡したいのですが? 'def validate(self、ID_C、ID_D):keys =(ID_C、ID_D)[list(key)+ [キーのキーのself.masterのキー]を返す'? – lastLeafFallen

+0

@lastLeafFallenシングルキーの検証方法の例を追加しました。 – niemmi

+0

私は今実装しようとしていますが、この行に構文エラーがあります。 'self.master = {(行['ID_A']、行['ID_C'])構文エラーが "for"という単語の 'o'と 'r'の間にあることを示し続けます。どんな考え? – lastLeafFallen

関連する問題