完美且最优雅的方式来处理SQL DB中的重复条目

时间:2018-05-29 09:58:00

标签: python list sqlite dictionary

好的,情况就是这样:

我们说我有一张名为" File_info"其中包含所有匹配label_set

的文件的列表

表:FILE_INFO

FILENAME                                      LABEL_NUMBER
----------------------------------------------------------------------
C:/Test_Software/6.avi                          11
C:/Test_Software/6.avi                          10
C:/Test_Software/6.avi                          8
C:/Test_Software/6.avi                          6
C:/26.avi                                       10
C:/26.avi                                       8
C:/Test_Software/Debug/Current_Frame2.avi       11
C:/Test_Software/Debug/Current_Frame2.avi       10
C:/Test_Software/Debug/Current_Frame1.avi       11
C:/Test_Software/Debug/Current_Frame1.avi       10
C:/Test_Software/26.avi                         11
C:/Test_Software/26.avi                         10
C:/Test_Software/26.avi                         9
C:/Test_Software/26.avi                         8
C:/Test_Software/26.avi                         6

我的目标是在SQLITE表中实现这个结构:

FILENAME                                       LABEL_NUMBER
----------------------------------------------------------------------
C:/Test_Software/6.avi                          11,10,8,6
C:/26.avi                                       10,8
C:/Test_Software/Debug/Current_Frame2.avi       11,10
C:/Test_Software/Debug/Current_Frame1.avi       11,10
C:/Test_Software/26.avi                         11,10,9,8,6

即。一个文件只能存储一次!!!

到目前为止,以下是我至少获得所需输出的步骤:

1)使用SQL Query查找具有重复标签的所有文件:

SELECT LABEL_NUMBER, FILENAME 
FROM FILE_INFO WHERE 
FILENAME 
in (SELECT FILENAME 
FROM FILE_INFO_SEARCH GROUP BY 
FILENAME HAVING COUNT(*)>1)

2)创建两个列表(a为file_list,b为label_list)

for file in find_duplicate_files: #Duplicate_Files contains the output of above SQL Query

    process_file.append(file[1])
    process_label.append(file[0])

3)使用pandas创建一个dict,格式为:

df = pd.DataFrame({'A' : process_file, 'B' : process_label})
new_dict = df.groupby('A').B.agg(','.join).to_dict()

到目前为止,我的输出看起来很棒:

C:/Test_Software/6.avi 11,10,8,6
C:/26.avi 10,8
C:/Test_Software/Debug/Current_Frame2.avi 11,10
C:/Test_Software/Debug/Current_Frame1.avi 11,10
C:/Test_Software/26.avi 11,10,9,8,6

但是,现在我离开了挑战的最后一部分:

4)在数据库中实施更改:

我有两个想法:

方法:1

a)删除表格中的所有重复条目

b)在Filename和Label_number列中插入所有dict键和值

方法:2

a)只需开始对每个键'进行查询。我的数据库中我的dict(包含文件名)的值,如果找到,则使用值

更新标签列

b)从表中删除重复的条目

我知道会有第三种最优雅的方式来做到这一点,我正在寻找相同的:-)

请记住:我有一百万条记录需要处理!!这两种方法虽然有效,但效率不高,因为我必须运行几个这样的查询。我正在寻找一些快速的简短答案

希望我提供的信息也可以帮助其他人!

0 个答案:

没有答案