我有两个.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:col 1,文件2:col 9,其中第一个col为col 1).
我想创建一个新文件,通过查看这个列来组合这两个文件(如:如果两个文件中都有一个MPID,那么在新文件中,这个MPID将出现在文件1的两行中)和它在文件2中的行.如果一个MPID只出现在一个文件中,那么它也应该进入这个组合文件.
文件未以任何方式排序.
如何在带有shell脚本或python的debian机器上执行此操作?
谢谢.
编辑:两个文件除了分隔字段之外没有逗号.
sort -t , -k index1 file1 > sorted1 sort -t , -k index2 file2 > sorted2 join -t , -1 index1 -2 index2 -a 1 -a 2 sorted1 sorted2
这是经典的"关系连接"问题.
你有几种算法.
嵌套循环.您从一个文件中读取以选择"主"记录.您读取整个其他文件,找到与主服务器匹配的所有"详细信息"记录.这是一个坏主意.
排序归并.您可以根据公共密钥将每个文件排序为临时副本.然后,您可以通过从主服务器读取来合并这两个文件,然后从详细信息中读取所有匹配的行并写入合并的记录.
抬头.您将其中一个文件完全读入内存中的字典,并由关键字段索引.这对于详细文件来说可能很棘手,每个键都有多个子项.然后你读取另一个文件并在字典中查找匹配的记录.
其中,排序合并通常是最快的.这完全使用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()