基于两列比较两个大型无序CSV文件

1 投票
5 回答
2325 浏览
提问于 2025-04-16 23:13

我需要比较两个大的、没有排序的 .csv 文件,主要是看它们的第一列和第三列。每个文件大约有20万条记录。最后的结果我想知道哪些记录在第一个文件中存在,但在第二个文件中不存在。这两个文件都是用逗号分隔的值文件。在比较的时候,第三列的内容不区分大小写。

示例文件1:

"id", "name", "email", "country"
"1233",  "jake", "jake@mailinator.com", "USA"
"2345", "alison", "Alison@mailinator.com", "Canada"
"3456", "jacob", "jacob@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"

文件2

"id", "name", "email", "country"
"2345", "alison", "alison@mailinator.com", "Canada"
"3456", "jacob", "jacob@mailinator.com", "USA"
"5690", "lina", "lina@mailinator.com", "Canada" 

期望的输出文件

"5678", "natalia", "natalia@mailinator.com", "USA"

如果能提供一些代码示例,那就太好了。

5 个回答

0

把文件里的内容加载到一个内存数据库里,比如说 H2,然后用SQL语句进行选择,并且可以用连接查询。

0

先把文件一个个读进来,放到两个数组(或者说哈希表)里。然后再读第二个文件,把每一行放到一个数组里。如果 array1[n]array2[n] 这两个数组里的内容在当前行的数组里找不到,就输出“缺失”。我会用Perl来做这个任务。

1

试试这个:

join -v 1 -i -t, -1 1 -2 1 -o 1.2 1.3 1.4 1.5  <(awk -F, '{print $1":"$3","$0}' f1.txt | sort) <(awk -F, '{print $1":"$3","$0}' f2.txt | sort)

这是怎么回事:

1) 我首先创建一个复合键列,也就是把第一列和第三列合并在一起:

awk -F, '{print $1":"$3","$0}' f1.txt
awk -F, '{print $1":"$3","$0}' f2.txt

2) 然后我对两个输出结果进行排序:

awk -F, '{print $1":"$3","$0}' f1.txt | sort 
awk -F, '{print $1":"$3","$0}' f2.txt | sort 

3) 接着我使用 join 命令,按照第一列(我的复合键)进行连接,并输出来自文件1的无法配对的行。

输出结果:

"1233",  "jake", "jake@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"

撰写回答