抑制一个 csv 文件对另一个值包含特定字符串的文件
Suppress one csv file against another where values contain specific strings
我正在尝试删除 file1.csv 中包含来自 file2.csv 和 python 的字符串的所有行。我希望它搜索 file1.csv 的 column1 中的所有值,并删除 column1 在其值中包含与 file2.csv.
中相同字符串的整行
我知道 bash 中的 grep -v 可以用一个命令做同样的事情。但是,我需要在 file2.csv 中针对 超过 40,000 个可能的字符串 抑制 file1.csv。 Bash 执行此命令时需要很长时间,甚至会崩溃。
有谁知道可以执行 grep -v 在 python 中执行的操作但在抑制具有数千个字符串的文件时执行的可靠脚本?
只是为了确保清楚:
File1.csv:
column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14
File2.csv:
column1
i4x
File3.csv:
column1,column2,column3
www.vfekjfwo11k.com,772,100
www.tum33kkwfl.com,1100,2
但是,我再次需要它在 python 中,因为 file2.csv 中的字符串数量超过 40,000。
可能适用于您的用例的一个解决方案是第 3 方库 Pandas + 正则表达式。
但是,我强烈建议您使用一种更高效的算法,例如实现基于 trie 的算法 Aho-Corasick, such as 。
import pandas as pd
from io import StringIO
mystr1 = StringIO("""column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14""")
mystr2 = StringIO("""column1
i4x""")
# read files, replace mystr1 / mystr2 with 'File1.csv' / 'File2.csv'
df = pd.read_csv(mystr1)
df_filter = pd.read_csv(mystr2)
# create regex string from filter values
str_filter = '|'.join(df_filter['column1'])
# apply filtering
df = df[~df['column1'].str.contains(str_filter)]
# export back to csv
df.to_csv('file_out.csv', index=False)
print(df)
column1 column2 column3
1 www.vfekjfwo11k.com 772 100
3 www.tum33kkwfl.com 1100 2
我正在尝试删除 file1.csv 中包含来自 file2.csv 和 python 的字符串的所有行。我希望它搜索 file1.csv 的 column1 中的所有值,并删除 column1 在其值中包含与 file2.csv.
中相同字符串的整行我知道 bash 中的 grep -v 可以用一个命令做同样的事情。但是,我需要在 file2.csv 中针对 超过 40,000 个可能的字符串 抑制 file1.csv。 Bash 执行此命令时需要很长时间,甚至会崩溃。
有谁知道可以执行 grep -v 在 python 中执行的操作但在抑制具有数千个字符串的文件时执行的可靠脚本?
只是为了确保清楚:
File1.csv:
column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14
File2.csv:
column1
i4x
File3.csv:
column1,column2,column3
www.vfekjfwo11k.com,772,100
www.tum33kkwfl.com,1100,2
但是,我再次需要它在 python 中,因为 file2.csv 中的字符串数量超过 40,000。
可能适用于您的用例的一个解决方案是第 3 方库 Pandas + 正则表达式。
但是,我强烈建议您使用一种更高效的算法,例如实现基于 trie 的算法 Aho-Corasick, such as
import pandas as pd
from io import StringIO
mystr1 = StringIO("""column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14""")
mystr2 = StringIO("""column1
i4x""")
# read files, replace mystr1 / mystr2 with 'File1.csv' / 'File2.csv'
df = pd.read_csv(mystr1)
df_filter = pd.read_csv(mystr2)
# create regex string from filter values
str_filter = '|'.join(df_filter['column1'])
# apply filtering
df = df[~df['column1'].str.contains(str_filter)]
# export back to csv
df.to_csv('file_out.csv', index=False)
print(df)
column1 column2 column3
1 www.vfekjfwo11k.com 772 100
3 www.tum33kkwfl.com 1100 2