当前位置:  开发笔记 > 编程语言 > 正文

通过公共列组合2个.csv文件

如何解决《通过公共列组合2个.csv文件》经验,为你挑选了2个好方法。

我有两个.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机器上执行此操作?

谢谢.

编辑:两个文件除了分隔字段之外没有逗号.



1> Pierre..:
sort -t , -k index1 file1 > sorted1
sort -t , -k index2 file2 > sorted2
join -t , -1 index1 -2 index2 -a 1 -a 2 sorted1 sorted2


提防引用的逗号!既不排序也不加入服从任何报价

2> S.Lott..:

这是经典的"关系连接"问题.

你有几种算法.

嵌套循环.您从一个文件中读取以选择"主"记录.您读取整个其他文件,找到与主服务器匹配的所有"详细信息"记录.这是一个坏主意.

排序归并.您可以根据公共密钥将每个文件排序为临时副本.然后,您可以通过从主服务器读取来合并这两个文件,然后从详细信息中读取所有匹配的行并写入合并的记录.

抬头.您将其中一个文件完全读入内存中的字典,并由关键字段索引.这对于详细文件来说可能很棘手,每个键都有多个子项.然后你读取另一个文件并在字典中查找匹配的记录.

其中,排序合并通常是最快的.这完全使用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()

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有