2017-06-30 111 views
1
#read in csv file in form ("case, num, val \n case1, 1, baz\n...") 
# convert to form FOO = "casenumval..." roughly 6 million characters 
for someString in List: #60,000 substrings 
    if substr not in FOO: 
     #do stuff 
    else: 
     #do other stuff 

所以我的问题是,有太多的子字符串来检查这个庞大的字符串。我已经尝试逐行阅读文件,并检查子线对线,但这仍然崩溃的程序。有没有什么技术可以有效地检查大量的子字符串是否对应一个非常大的字符串?在大字符串中查找子字符串

FOR CONTEXT: 我正在执行数据检查,怀疑数据保存到csv文件以供审查/更改。然后将该已审阅/更改的文件与原始文件进行比较。没有改变的数据已被验证为良好,必须保存到新的“exceptionFile”中。已被更改并通过的数据被忽略。并且已经被更改并且被检查并且仍然怀疑的数据被再次发送以供审查。

+0

如果'otherString'实际上是一个字符串,循环会遍历_individual characters_,不子。 – ForceBru

+0

你读过这个问题吗? https://stackoverflow.com/questions/1765579/fast-algorithm-for-searching-for-substrings-in-a-string – Idos

+0

这将有助于,如果你告诉我们什么“做东西”和“做其他事情”需要知道。例如,它是否重要_哪些子字符串被找到,或者你只是在寻找它们? – zwol

回答

2

你应该做的第一件事就是将您的60000个字符串列表来搜索到一个大的正则表达式:

for m in searcher.finditer(FOO): 
    print(m.group(0)) # prints the substring that matched 

import re 
searcher = re.compile("|".join(re.escape(s) for s in List) 

现在你可以一次全部搜索它们

如果你只关心的是知道哪些被发现,

print(set(m.group(0) for m in searcher.finditer(FOO)) 

这仍然在做比绝对最低限度更多的工作,但它应该比以前做的更有效率。另外,如果您知道您的输入是CSV文件,并且您也知道没有任何字符串搜索包含换行符,则可以逐行操作,这可能会或可能不是更快不是取决于条件,你在做什么,但肯定会用较少的内存什么:

with open("foo.csv") as FOO: 
    for line in FOO: 
     for m in searcher.finditer(line): 
      # do something with the substring that matched 
+0

谢谢您的回答,我会立即对此进行测试。 – alexjones