2016-08-10 4 views
0

以下のコードは、csvファイルのfile1とfile2を調べています。各ファイルの一意のキーに基づいて、それらをcsv相互参照ファイルと比較し、一致するものがあれば、file1とfile2の一意の識別子を比較します。一致するものがあれば、file2の値を選択し、それ以外の場合は、file1から値を選択して書き込みます。比較、解析、書き込みのCSVファイル

import csv, datetime, calendar 
global_dic = {} 
with open('D:\\hello.csv', 'r') as file0: 

    reader1 = csv.reader(file0, delimiter='\t') 
    header = next(reader1) 

    for row in reader1: 
     key = (row[0] + '|' + row[1] + '|' + row[2] + '|' + row[3]) 
     global_dic[key] = {header[0]: row[0], header[1]: row[1], header[2]: row[2], header[3]: row[3], header[4]: row[4], header[5]: row[5], header[6]: row[6], header[7]: row[7], header[8]: row[8], header[9]: row[9]} 


with open('D:\\file1.csv', 'r') as master: 
    master_indices = dict(((r[0] + r[1] + r[2] + r[3] + r[4]), i) for i, r in enumerate(csv.reader(master)) if '/' in r[0]) 

with open('D:\\file2.csv', 'r') as hosts: 
    with open('results1.csv', 'w') as results: 
     reader = csv.reader(hosts) 
     writer = csv.writer(results) 

     writer.writerow(next(reader, []) + ['RESULTS']) 

     for row in reader: 

      if '/' in row[0]: 
       key = row[1] + row[2] + row[3] + row[4] 
       value = row[6] 
       if key in global_dic: 

        meow = datetime.datetime.strptime(row[0], '%m/%d/%Y %H:%M:%S') # change str time to date/time obj && add .%f for ms consolidation 
        unix_timestamp = calendar.timegm(meow.timetuple()) # do the conversion to unix stamp 
        time_ms = unix_timestamp * 1000 

        index = master_indices.get(row[0] + row[1] + row[2] + row[3] + row[4]) 
        if index is not None: 
         a = '' 
        else: 
         writer.writerow('value' + ',' + str(global_dic[key]['cpKey']) + ',' + str(global_dic[key]['SCADA Key']) + ',' + str(value) + ',' + str(time_ms) + ',' + str(time_ms) + ',' + '0' + ',' + '0' + ',' + '0' + '\n') 

に問題必要なヘルプ: 私はmaster_indeciesからR [6]を持参する方法を知っていけない試合があるとき、私はしかし、ファイルを書き込むことができます一致するものが存在しないとき。私はそれがマッチング処理中に問題を作成するよりも、辞書に[6] Rが含まれている場合

    if index is not None: 
         # HELPPPPPPPPPP 
        else: 
         writer.writerow('value' + ',' + str(global_dic[key]['cpKey']) + ',' + str(global_dic[key]['SCADA Key']) + ',' + str(value) + ',' + str(time_ms) + ',' + str(time_ms) + ',' + '0' + ',' + '0' + ',' + '0' + '\n') 

答えて

0

提供されたコードは、あまりにも複雑である第一、それを容易にしてみてください。 (これらの相互参照(複数可)を含むファイル?)より良い名前を使用

に私のようなsomethink、小さい方の手順は、この問題を解決する正しい方法だと思います:

dict1 = get_dict_from_csv('file1.csv') 
dict2 = get_dict_from_csv('file2.csv') 
cross_refs = get_cross_refs_from_csv('cross_refs.csv') 
with open('result.csv', mode='w') as result: 
    for row in dict1: 
     #... 
     if index is not None: 
      writer.writerow(dict2[index]) 

ので、ライブがはるかに容易になります私の2番目のアドバイスは、あなたのコードをリファクタリングすることです。とにかく幸運!

編集:Read two textfile line by line simultaneously -pythonを見て、同時にいくつかのファイルを読む方法の例を入手してください。

乾杯ラース

関連する問題