text-processing – 选择文件中不包含其他文件中的值的行

我有两个文件.一个是具有60490行的数据CSV.每一行都是一组值,例如客户名称,服务日期等.

第一个文件中的其中一个值是VIN值.

我有第二个大文件,其中包含92809个VIN列表.

我需要找到一种方法来删除第一个文件中第二个文件中列出的VIN的所有行.

我试过下面的grep.这确实做了我期望它做的事情但是它也非常慢并且在输出大约50行之后被OS杀死.

$grep -v -f vinlist data.csv> output.csv

实现这一目标的最快方法是什么?我在研究过程中发现的一切似乎都需要完全排序的数据,两个文件中的行相同或需要很长时间/被OS杀死

data.csv

123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1C4NJPBB4DD122174,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1GMDV33179D147281,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1FUYDCYB7WP879651,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1FM5K8D8XFGA82149,2014-01-20  
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,5TDBT48A72S003496,2014-01-20  

vinlist:

JF1VA1E6XH9812361  
1HGCP26369A103521  
3N1CN7AP0CL810631  
5XYZK3AB7BG089758  
1FM5K8D8XFGA82149  
4S3BMBG61C3019520  
1FTNE24LX4HA22330  
1N4AL3AP8FC420210  
2GTEC19C491123429  
3N1CN7AP5FL944233  
最佳答案
由于我们知道vin在哪一行,我们不需要进行通用搜索.相反,我们可以将vins读入一个索引的数据结构,以便快速查找.

使用Python,您可以:

码:

# read the vins into a set to allow fast lookup
with open('file3', 'rU') as f:
    vins = {vin.strip() for vin in f.readlines()}

# go through the data file one line at a time
with open('file2', 'rU') as f:
    for line in f.readlines():

        # get the vin in the line
        vin = line.split(',')[8]

        # if the vin is not in our set, print out the line
        if vin not in vins:
            print(line.strip())

结果:

123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1C4NJPBB4DD122174,2014-01-20
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1GMDV33179D147281,2014-01-20
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,1FUYDCYB7WP879651,2014-01-20
123,email@example.com,JOE,BLOGGS,123456789,12345-123,"Place Name",12345,5TDBT48A72S003496,2014-01-20

转载注明原文:text-processing – 选择文件中不包含其他文件中的值的行 - 代码日志