在具有多种模式的大文件中查找/替换特定列

在具有多种模式的大文件中查找/替换特定列

我有一个 100GB 的 CSV 文件。看起来像这样:

11,aa,gg,tt
ew,11,rggr,tr

第二个文件指定了替换(此文件中有 20,000 行):

gg,q
aaa,b

我想要做的是遍历第一个文件中的每一行,并替换第三列的值(如果该值出现在第二个文件中)(例如,在本例中用 q 替换 gg)。请注意,这仅当整个字符串出现在第三列时才有效。因此,对于当前示例,结果将是:

11,aa,q,tt
ew,11,rggr,tr

实现这一目标的好方法是什么?

答案1

考虑到文件的大小,我会选择使用 Perl 或 Python 等语言编写此代码,以便我可以将替换文件加载到内存中(加载到哈希或字典中以便快速查找),然后逐行解析主 csv 文件。下面是使用 Python 编写的示例,说明如何执行此操作,假设您的 csv 文件对于替换文件名为“replace.csv”,对于主 csv 文件名为“big.csv”。

#!/usr/bin/python
import csv
import sys

repl = dict()

# Load replacements into memory
with open("replace.csv", "r") as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    for row in reader:
        if len(row) >= 2:
            repl[row[0]] = row[1]

# Do the replacements
with open("big.csv", "r") as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    writer = csv.writer(sys.stdout)
    for row in reader:
        if len(row) >= 3:
            if row[2] in repl:
                    row[2] = repl[row[2]]
            writer.writerow(row)

相关内容