2016-12-03 9 views
0

私はpython 2.7を使用して、それをMySQLデータベースにチャッキングする前にCSVファイルからいくつかのデータを消去しています。PythonのCSVでデータを比較する

各行は、タイムスタンプを持つユーザーエントリです。

データをdbに送信する前に、重複する行(同じユーザー名の2行)を確認してから、同じ行にあるタイマーを使用して、保持するものを確認します。私は2次元配列内の項目を比較すると混乱して取得しています考えて

# set up data container 
data = [] 

# read csv file 
with open(file, 'rU') as f: 
    # create file reader 
    reader = csv.reader(f) 

    # skip first row (headers) 
    next(reader) 

    # gather data in a table 
    for row in reader: 
     data.append(row) 

...私は、ユーザ名がdata[][1]であることを知っていると、タイマー(int)がdata[][52]です。

私はこのような新しいリストを作成しようとしました:

usernames = [] 
cleaner_list = data 
for row in data: 
    if row[1] is in usernames: 
     # dupe 
    else: 
     usernames.append(row[2]) 

しかし、私は、このような本などのデータを比較しようとすると、範囲外続ける:

if row[1] is in usernames: 
     if row[52] > usernames[row[2]][52]: 
      # delete row[52] from cleaner_data 
     else: 
      # delete the equivalent row in usernames from cleaner_data 

私はと感じて、私はこれを考え直していますが、私はsetを使用することはできません。私は一意のユーザー名の列挙型リストを作成し、CSV列にフィルタをかけることを考えましたが、重複を見つけてその削除を行う前にタイマーを確認する必要がある場合は、行への正しい参照を維持する方法がわかりません。 本当にありがとうございます!

答えて

0

私は次のようにします: 関連付けられた最後のタイムスタンプを持つユーザーの辞書を保管してください。 CSVをスキャン中に新しいものが見つかった場合は、古い値を置き換えてください。

cleaner_data = {} 
for row in data: 
    if row[1] not in cleaner_data: # user name not yet seen: add 
    cleaner_data[row[1]] = row 
    else: 
    if row[52] > cleaner_data[row[1]][52]: # already seen, but newer timestamp: replace 
     cleaner_data[row[1]] = row