按公用列组合2个.csv文件

2024-06-24 12:56:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个.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是col1)。

我想创建一个新文件,通过查看此列将这两个文件组合在一起(如中所示:如果两个文件中都有MPID,则在新文件中,该MPID将显示为来自文件1的行和来自文件2的行)。如果一个MPID只出现在一个文件中,那么它也应该进入这个组合文件。

文件没有以任何方式排序。

如何在一个带有shell脚本或python的debian机器上执行此操作?

谢谢。

编辑:除了分隔字段的文件外,两个文件都没有逗号。


Tags: 文件csvnameimageidurlmodelcol
3条回答

您需要查看shell中的join命令。您还需要对数据进行排序,可能会丢失第一行。如果任何一个数据包含逗号,整个过程都将一落千丈。或者,您需要使用CSV敏感的进程来处理数据,该进程引入了不同的字段分隔符(可能是control-a),您可以使用它来明确地拆分字段。

另一种方法是使用Python,将两个文件读入一对字典(键入公共列),然后使用循环覆盖两个字典中较小的一个字典中的所有元素,在另一个字典中查找匹配的值。(这是基本的嵌套循环查询处理。)

这就是经典的“关系连接”问题。

你有几个算法。

  • 嵌套循环。你从一个文件中读取来选择一个“主”记录。您将读取整个其他文件,查找与主文件匹配的所有“详细信息”记录。这是个坏主意。

  • 排序合并。根据公用密钥将每个文件排序为临时副本。然后,通过读取主控文件,然后从详细信息中读取所有匹配的行并写入合并的记录来合并这两个文件。

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

其中,排序合并通常是最快的。这完全是使用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()
sort -t , -k index1 file1 > sorted1
sort -t , -k index2 file2 > sorted2
join -t , -1 index1 -2 index2 -a 1 -a 2 sorted1 sorted2

相关问题 更多 >