所以我有2个文件,文件1有4列160000行数值数据和文件2有26列150000的数值数据。我想知道是否有一种方法来匹配两个文件中相同的值,并显示这些匹配的行。我试图减少文件2中的行数以匹配文件1的行数。匹配和显示行
Q
匹配和显示行
1
A
回答
1
我在这里做一些假设:
两个文件都不是一个有用的排序顺序,所以有步调一致迭代没有有效的方法。
您有足够的内存用于一组160000个4元组短字符串。
您可以按字符串而不是数字进行匹配(例如,您不会在文件1中具有“0013”而在文件2中具有“00013”并期望它们匹配)。如果不是,只需将每个
line.split()
更改为int(col) for col in line.split()
即可。 (这也可能会减少内存使用量,但也可能会减慢速度。无论如何,除非出现问题,否则更简单通常会更好。)您的格式不过是以空格分隔的数字。如果它更复杂,请按照acjohnson55的建议使用
csv
模块。匹配列是文件2中的前四列,它们与文件1中的顺序相同。否则,您需要添加诸如
cols = cols[3], cols[14], cols[15], cols[1]
之类的内容。
如果这些都是很好的假设,下面的代码:
with open(path1, 'r') as f1:
data = set(tuple(line.split()) for line in f1)
with open(path2, 'r') as f2, open(outpath, 'w') as f3:
for line in f2:
cols = line.split()
if tuple(cols[:4]) in data:
f3.write(line + '\n')
+0
+1代表实际的代码! – acjay
1
0
你可以使用我张贴在回答的技术到一个较早的问题,在这里:How to vectorize a simple for loop in Python/Numpy
基本上,阅读这两个文件到numpy的数组,这两个数组排序,步调一致迭代。其他人描述的基于哈希的代码(元组集合)几乎肯定会使用比这更多的内存:)哪一个更快,你得试试看。
import numpy as np
def is_less(a, b):
# this ugliness is needed because we want to compare lexicographically same as np.lexsort(), from the last column backward
for i in range(len(a)-1, -1, -1):
if a[i]<b[i]: return True
elif a[i]>b[i]: return False
return False
def is_equal(a, b):
for i in range(len(a)):
if a[i] != b[i]: return False
return True
arr1 = np.fromfile('arr1.csv', sep=',')
arr2 = np.fromfile('arr2.csv', sep=',')
idx1 = np.lexsort(arr1.transpose())
idx2 = np.lexsort(arr2.transpose())
ii = 0
jj = 0
while ii < len(arr1) and jj < len(arr2):
a = arr1[ idx1[ii] , : ] # use all columns from this
b = arr2[ idx2[jj] , 0:4 ] # use only first four columns; or select the right ones with an appropriate slice
if is_equal(a, b):
# do stuff with match
print "match found: arr1[%d]=%s arr2[%d]=%s" % (idx1[ii], repr(a), idx2[jj], repr(b))
ii += 1
jj += 1
elif is_less(a, b):
ii += 1
else:
jj += 1
相关问题
- 1. 显示gridview的匹配ID的匹配
- 2. ArrayIndexOutOfBoundException当显示匹配的行
- 3. Git diff -S仅显示匹配的行
- 4. AWK显示最后匹配的行数
- 5. 匹配数据和显示的内容不匹配
- 6. 匹配和JSON jQuery的显示数值
- 7. 只显示完全匹配
- 8. 显示不匹配的值
- 9. javascript - 显示匹配项onkeyup
- 10. 显示模板匹配
- 11. 对齐列和行以匹配显示宽度
- 12. 使用模式和匹配器时显示行
- 13. 匹配colums和行
- 14. 当匹配col-md时显示div,但匹配时不显示它col-sm
- 15. EWS比较ItemID显示不匹配,但ItemID.ToString比较显示匹配。
- 16. 匹配行首和行尾
- 17. 打印匹配和不匹配的行; awk:打印匹配组
- 18. PHP SQL序列号之间,如果匹配显示OK,如果不匹配,显示不匹配
- 19. 匹配两个表中的数据如果匹配..显示名称和味精
- 20. 比较两个表格数据并显示不匹配和匹配数据
- 21. 源码:围绕匹配的行选择显示几行
- 22. 如何显示与其他表中的行不匹配的行?
- 23. 两个数组匹配它们并显示不匹配
- 24. NSPredicate用(匹配或匹配)和匹配
- 25. 多行匹配和解析
- 26. 拆分和匹配行
- 27. 选择列和匹配行
- 28. 匹配行和减列
- 29. XSL将父项显示为列,并将匹配的子项显示为行
- 30. 如何显示匹配VehicleMake(MncisCode)的NcicCode?
什么构成匹配,因为文件1有4列,但文件2有26? – acjay
文件1中的4列也在文件2中。匹配是它们具有相同的数值。 – user1821176
他们是否按排序?如果不是,你是否有足够的内存一次读取整个较小的文件(大概是文件1)? – abarnert