2015-04-05 33 views
0

我的人數據集(CSV),並像他們的投票地點:如何將CSV列表標準化爲2個或多個單獨的文件?

**Person | Voting Place | VP address | ....** 

John Doe | Zoo | 123 fake street | .... 

Jane Doe | Zoo | 123 fake street | .... 

Joey Ramone | Park | 814 Real Street | ... 

我想這個正常化的數據,使得位置拉出到一個單獨的列表,重複數據刪除,並分配一個任意ID #。然後人們將被存儲在一個單獨的文件中,並參考投票位置ID#而不是實際的信息。

我知道如何使用python集來重複刪除列的組合並在他們自己的文件中將它們分解出來。我不明白的是如何在SET()列表中獲取/分配每個元素的ID,以便稍後使用它可以返回給它?可這對一個迭代通過CSV做這樣

for row in file: 
    person = [row[0], row[1]] 
    voting_location = [row[2],row[3]] 
    if voting_location not in unique_set: 
     add to set 
     get ID of element in set 
     write location line in location file 
    else: # location already in list so its a duplicate 
     get id of location already in list 
    append id to person_list 
    write person line in person file 

有沒有辦法在純Python/CSV做到這一點還是我需要啓動一個合適的關係型數據庫來獲取任務完成?

回答

0

您可以使用字典。使用的投票地點爲鍵和相應的值,使誰是那裏註冊的選民的名單:

import csv 
from collections import OrderedDict 


data = OrderedDict() 
with open('input.txt') as f: 
    reader = csv.reader(f, delimiter='|') 
    for row in reader: 
     row = [e.strip() for e in row] 
     person = row[0] 
     location = (row[1], row[2]) 

     if location not in data: data[location] = [] 

     data[location].append(person) 

# Show voting places 
print("Voting places (voting_place_id, voting_place):") 
for (i,k) in enumerate(data): 
    print(" %3d %s" % (i,k)) 
print("") 

# Show voters 
print("Voters (voting_place_id, person):") 
for (i,k) in enumerate(data): 
    for p in data[k]: 
     print(" %3d %s" % (i,p)) 
print("") 

輸出:

 
Voting places (voting_place_id, voting_place): 
    0 ('Voting Place', 'VP address') 
    1 ('Zoo', '123 fake street') 
    2 ('Park', '814 Real Street') 

Voters (voting_place_id, person): 
    0 Person 
    1 John Doe 
    1 Jane Doe 
    2 Joey Ramone 

沒有保存這個腳本的運行之間的狀態,所以如果你用一半的數據集運行它,然後再用剩下的數據集重複使用相同的「地點id」,而不考慮第一次運行生成的ID。

不過,如果你數據追加到自己的原始數據,並再次運行程序,從第一次運行會匹配來自第二次運行生成的ID生成的ID,只要沒有在存在該行的變化第一次(這就是爲什麼我們使用OrderedDict而不是dict)。

如果你想要持久化狀態,你可以在pickleunpickle之間運行data字典。或者將有序鍵轉儲到文件中,並用這些鍵初始化data字典。

+0

謝謝。我認爲你已經用orderedDict解決了一個很好的解決方案。據推測,如果該位置已經在orderedDict中,我可以迭代它以發現它是「行號」。 它發生在我身上,我可以散列位置數據的連接並將散列值存儲在人員和位置CSV中。每個獨特的組合應該產生相同的散列值。這會起作用嗎? – 2015-04-05 01:59:06

+0

每個獨特的對*幾乎*絕對會產生一個獨特的哈希,但哈希碰撞是可能的,需要考慮。字典會在幕後透明地處理這個問題,所以如果你想實現自己的系統願望散列,你至少應該檢查散列衝突(可能保存以前生成的散列列表?)。 – jedwards 2015-04-05 02:03:42

相關問題