8 python csv shell debian join
我有两个.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
Run Code Online (Sandbox Code Playgroud)
文件2的第一行:
Regular Price,Sale Price,Manufacturer Name,Model Number,Retailer Category,Buy URL,Product Name,Availability,Shipping Cost,Condition,MPID,Image URL,UPC,Description
Run Code Online (Sandbox Code Playgroud)
然后每个文件的其余部分都填充了信息.
如您所见,两个文件都有一个名为MPID的公共字段(文件1:col 1,文件2:col 9,其中第一个col为col 1).
我想创建一个新文件,通过查看这个列来组合这两个文件(如:如果两个文件中都有一个MPID,那么在新文件中,这个MPID将出现在文件1的两行中)和它在文件2中的行.如果一个MPID只出现在一个文件中,那么它也应该进入这个组合文件.
文件未以任何方式排序.
如何在带有shell脚本或python的debian机器上执行此操作?
谢谢.
编辑:两个文件除了分隔字段之外没有逗号.
Pie*_*rre 13
sort -t , -k index1 file1 > sorted1
sort -t , -k index2 file2 > sorted2
join -t , -1 index1 -2 index2 -a 1 -a 2 sorted1 sorted2
Run Code Online (Sandbox Code Playgroud)
S.L*_*ott 10
这是经典的"关系连接"问题.
你有几种算法.
嵌套循环.您从一个文件中读取以选择"主"记录.您读取整个其他文件,找到与主服务器匹配的所有"详细信息"记录.这是一个坏主意.
排序归并.您可以根据公共密钥将每个文件排序为临时副本.然后,您可以通过从主服务器读取来合并这两个文件,然后从详细信息中读取所有匹配的行并写入合并的记录.
抬头.您将其中一个文件完全读入内存中的字典,并由关键字段索引.这对于详细文件来说可能很棘手,每个键都有多个子项.然后你读取另一个文件并在字典中查找匹配的记录.
其中,排序合并通常是最快的.这完全使用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()
Run Code Online (Sandbox Code Playgroud)
您似乎正在尝试在 shell 脚本中执行此操作,这通常是使用 SQL Server 完成的。是否可以使用 SQL 来完成该任务?例如,您可以将这两个文件导入 mysql,然后创建一个联接,然后将其导出到 CSV。
| 归档时间: |
|
| 查看次数: |
11984 次 |
| 最近记录: |