Python:合并两个csv文件,并在主数据和使用数据中将其标记为不匹配

时间:2018-10-17 13:51:46

标签: python csv merge

我对python有点陌生,如果我的问题无关紧要,请对不起。我有两个要匹配的CSV文件

文件1

sa_name  
ABC  
DEF  
ACE  
ABCD  
BCD    

文件2

rs_name  
ABCD  
CDE  
DEFG  
ABCDE  
ABE  

我希望我的输出文件像这样:
输出文件

sa_name, rs_name, merge  
ABC, ABCD, 3  
ABC, ABCDE, 3  
ACE, ,1  
DEF, DEFG, 3  
ABCD, ABCDE, 3  
ABCD, ABCD, 3
BCD, ABCD, 3  
BCD, ABCDE, 3  
 , CDE, 2  
 , ABE, 2

因此规则是,如果file1.csv中的行是file2中行的子字符串,则merge = 3,如果数据仅在file1.csv中,则merge = 1,如果数据仅在file2.csv中,则合并= 2。

我只知道如何使用merge = 3获取那些行,但不知道如何合并两个csv文件并将那些不匹配的文件保留在输出文件中,并且还指示它们是来自文件1还是来自文件2。
我的代码如下:

import csv

with open('file2.csv', encoding='UTF-8', newline='') as RS:
RS_reader = csv.reader(RS)
rows = [row for row in RS_reader] 
print("RS data loaded...")

with open('file2.csv', encoding='UTF-8', newline='') as SA:
with open('RS_SA.csv', 'w', encoding='UTF-8') as RS_SA:
    SA_reader = csv.reader(SA)
    print("SA data loaded")
    RS_SA_writer = csv.writer(RS_SA)
    RS_SA_writer.writerow(next(SA_reader, None) + rows[0])
    print("Header written to the ourput file...")

    d = 0
    for line in SA_reader:
        match2 = line[0]
        for row in rows:
            match1 = row[0]      
            if match2 in match1:
                new_row = [','.join(line+row)] 
                SA_writer.writerow(new_row)
                d = d+1
                print(d)
                print(new_row)

有人知道如何进行吗? 非常感谢!

一些更新:在我的file1中,我有100列和6百万个观测值,在文件2中,我有20列有3500个观测值。这些与我的匹配无关,因此我没有在示例文件中添加它们。

1 个答案:

答案 0 :(得分:0)

假设您已将两个文件读入“ sa_name”和“ rs_name”,这将为您提供一个final_list,它是一个列表列表,每个列表代表一行要写入csv文件的列表。然后,可以根据需要按第一列进行排序。这可能需要一些验证,具体取决于您的文件大小等。

sa_name  = ['ABC','DEF','ACE','ABCD','BCD']
rs_name  = ['ABCD','CDE','DEFG','ABCDE','ABE']
found_rs_name, final_list = [], []

for sa in sa_name:
    found = False 
    for rs in rs_name:
        if sa in rs:
            final_list.append([sa,rs,3])
            found_rs_name.append(rs)
            found = True

    if not found:
        final_list.append([sa,"",1])

for rs in rs_name:
    if rs not in found_rs_name:
        final_list.append(["",rs,2])