通过公共列合并两个.csv文件
我有两个.csv文件,文件1的第一行是:
MPID,Title,Description,Model,Category ID,Category Description,Subcategory ID,Subcategory Description,Manufacturer ID,Manufacturer Description,URL,Manufacturer (Brand) URL,Image URL,AR Price,Price,Ship Price,Stock,Condition
文件2的第一行是:
Regular Price,Sale Price,Manufacturer Name,Model Number,Retailer Category,Buy URL,Product Name,Availability,Shipping Cost,Condition,MPID,Image URL,UPC,Description
然后每个文件的其余部分都是一些信息。
你可以看到,这两个文件都有一个共同的字段叫做MPID(在文件1中是第一列,在文件2中是第九列,第一列就是第一列)。
我想创建一个新文件,把这两个文件结合起来,方法是查看这个字段(也就是说:如果有一个MPID在两个文件中都出现,那么在新文件中这个MPID会显示出文件1和文件2中的对应行)。如果某个MPID只出现在一个文件中,它也应该出现在这个合并后的文件里。
这两个文件没有经过任何排序。
我该如何在Debian机器上用shell脚本或Python来实现这个呢?
谢谢。
补充说明:这两个文件除了用来分隔字段的逗号外,没有其他逗号。
6 个回答
你需要看看命令行中的 join
命令。你还需要对数据进行排序,可能还要去掉前面的几行。如果数据中有逗号,这整个过程就会出问题。或者你需要用一种能处理CSV格式的方式,使用不同的字段分隔符(比如控制字符A),这样才能清楚地分开字段。
另一种方法是使用Python,它会把两个文件读入成一对字典(用共同的列作为键),然后用一个循环遍历较小的字典中的所有元素,去寻找在另一个字典中匹配的值。(这就是基本的嵌套循环查询处理。)
这是一个经典的“关系连接”问题。
你有几种算法可以选择。
嵌套循环。你从一个文件中读取一个“主”记录,然后从另一个文件中读取所有与这个主记录匹配的“详细”记录。这个方法不好。
排序合并。你先把每个文件根据共同的关键字排序,存到一个临时副本中。然后你通过读取主文件,接着读取所有匹配的详细记录,将它们合并在一起。
查找。你把其中一个文件的所有内容读入内存中的一个字典,字典是根据关键字段索引的。对于详细文件来说,这可能有点复杂,因为每个关键字可能有多个子记录。然后你读取另一个文件,在字典中查找匹配的记录。
在这些方法中,排序合并通常是最快的。这完全是通过Unix的 sort 命令来完成的。
查找实现
import csv
import collections
index = collections.defaultdict(list)
file1= open( "someFile", "rb" )
rdr= csv.DictReader( file1 )
for row in rdr:
index[row['MPID']].append( row )
file1.close()
file2= open( "anotherFile", "rb" )
rdr= csv.DictReader( file2 )
for row in rdr:
print row, index[row['MPID']]
file2.close()