2017-12-06 7 views
5

私は、のようにであるCSVファイル2を有する2つのCSVファイルを比較するには?

Alabama  AL 1 
Alaska  AK 2 
Arizona  AZ 4 
Arkansas AR 5 
California CA 6 
Colorado CO 8 
Connecticut CT 9 
SEATTLE  WA 53 

は、今私は、CSVへのCSVファイル2から3列目の値を追加する必要が

FLAGSTAFF AZ 50244.67 5.02 KA1_Podium_Garage_S 
FLAGSTAFF AZ 33752.13 3.38 KA1_Podium_Garage_S 
FLAGSTAFF AZ 11965.5  1.2 KA1_Podium_Garage_S 
FLAGSTAFF AZ 3966.48  0.4 KA1_Podium_Garage_S 
SEATTLE  WA 12646.9  1.26 KA1_Podium_Garage_S 
SEATTLE  WA 225053.92 22.51 KA1_Podium_Garage_S 
SEATTLE  WA 23974.3  2.4 KA1_Podium_Garage_S 
SEATTLE  WA 7036.4  0.7 KA1_Podium_Garage_S 
SEATTLE  WA 3021.93  0.3 KA1_Podium_Garage_S 

似ているCSV FILE1を有しますそれはのようになります。たとえば、第二のカラム

を比較することで、FILE1、 、

AZコードは4 WAコードであるAZ、WAは私のcsvファイルfile1でありどこ、コードが列に追加取得する必要があります53 ある

私の出力は、同じよう

FLAGSTAFF AZ 50244.67 5.02 KA1_Podium_Garage_S 4 
FLAGSTAFF AZ 33752.13 3.38 KA1_Podium_Garage_S 4 
FLAGSTAFF AZ 11965.5  1.2 KA1_Podium_Garage_S 4 
FLAGSTAFF AZ 3966.48  0.4 KA1_Podium_Garage_S 4 
SEATTLE  WA 12646.9  1.26 KA1_Podium_Garage_S 53 
SEATTLE  WA 225053.92 22.51 KA1_Podium_Garage_S 53 
SEATTLE  WA 23974.3  2.4 KA1_Podium_Garage_S 53 
SEATTLE  WA 7036.4  0.7 KA1_Podium_Garage_S 53 
SEATTLE  WA 3021.93  0.3 KA1_Podium_Garage_S 53 

になります。ここで私が試したコード、

with open("/home/sumit/Desktop/CSV_FILE1.csv", "r") as f: 
    first = {rows[1]: rows[0:] for rows in list(csv.reader(f))} 

# compare second csv and append Code 
with open("CSVFILE2.csv", "r") as f1: 
    for row in csv.reader(f1): 
     if row[1] in first: 
      first[row[1]].append(row[2]) 

# convert dict back to list 
merged = [(k,) + tuple(v) for k, v in first.items()] 

# write list to output csv 
with open("output.csv", "w") as f1: 
    csv.writer(f1).writerows(merged) 

出力は、同様に取得しています

AZ FLAGSTAFF AZ 44230.4 4.42 KA1_Podium_Garage_S 4 
WA SEATTLE  WA 45329.3 4.53 KA1_Podium_Garage_S 53 
+0

'dict'のみ各キーに対して1つの値を有することができます。異なる値で複数回キーを追加しようとすると、最新のものだけが使用されます –

+0

ロジックを切り替えることをお勧めします.2つ目のcsvファイルは各状態のインスタンスを1つしか持たないようです。そのcsvでdictを作成します。ここでキー:valのペアはstate:numbersで、最初のcsvを繰り返して必要に応じて値を追加します。 –

答えて

2

この行は、最初のファイルの状態の省略形に基づいて辞書を作成しています。これは間違っています。ディクショナリには各キーを1回しか持たせることができず、たとえば "AZ"のような複数の行があります。

first = { rows[1]: rows[0:] for rows in list(csv.reader(f)) } 

代わりに、あなたはあなたの辞書2番目のファイルに基づいて行う必要があります。そして、

with open("CSVFILE2.csv", "r") as f1: 
    code = { row[1]: row[2] for row in csv.reader(f1) } 

、あなたの最初のファイルをループし、各列に適切なコードを追加します。

with open("/home/sumit/Desktop/CSV_FILE1.csv", "r") as f: 
    merged = [ row + [code[row[1]]] for row in csv.reader(f) ] 

そして、新しいファイルにマージしたデータを書き出します。 row + [code[row[1]]]


説明:

行が["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S"]ある場合、

  • row[1]
  • [code[row[1]]]がリストされ、
  • code[row[1]]4あるcode["AZ"]で、"AZ"[4]
  • row + [code[row[1]]を所望の新しい行の値を生成する、リストの連結である:["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S", 4]
関連する問題