Text-Processing
選擇文件中不包含另一個文件中的值的行
我有兩個文件。一種是包含 60490 行數據的 CSV。每行是一組值,例如客戶名稱、服務日期等。
第一個文件中的這些值之一是 VIN 值。
我有一個包含 92809 VIN 列表的第二個大文件。
我需要找到一種方法來刪除第一個文件中第二個文件中列出了 VIN 的所有行。
我試過下面的grep。這確實符合我的預期,但它也非常慢,並且在輸出大約 50 行後被作業系統殺死。
$ grep -v -f vinlist data.csv > output.csv
實現這一目標的最快方法是什麼?我在研究時發現的所有東西似乎都需要完全排序的數據,兩個文件中的行相同或需要很長時間/被作業系統殺死
數據.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
酒單:
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