2015-04-05 30 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

相关问题