我对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个观测值。这些与我的匹配无关,因此我没有在示例文件中添加它们。
答案 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])