簡體   English   中英

高效獲取大型文本文件中以給定字符串開頭的所有行

[英]Efficiently get all lines starting with given string for a large text file

我有一個大約 700k 行的大文本文件。

對於給定的字符串,我希望能夠高效地找到文件中以該字符串開頭的所有行。 我想反復查詢它,因此每個查詢都應該很快,而且我最初並不擔心較長的設置時間。

我猜我可以通過轉換文件使行已經按字母順序排列來更有效地做到這一點? 如果是這樣,這樣做的好方法是什么? 或者我可以考慮使用不同的數據結構嗎?

准備好數據后,什么是有效的搜索方式?

我會很樂意用正則表達式做一些基本的事情,或者逐行閱讀並測試行首,但這兩種解決方案似乎都很松懈? 似乎應該有一個很好理解的算法來處理這種事情?

在給你最好的解決方案之前,我需要問兩個問題:

  1. 文本是按字典順序排列的嗎?
  2. 如果不是,按字母順序排列的准確度是多少? (一行中有多少個字符,直到排序中發生錯誤)

如果您的文件是按字典順序排列的,那么您很幸運。 您將能夠使用二進制搜索的修改來縮小以給定字符串開頭的行的范圍。

如果您的文件僅按字母順序排列,您可以像第一個解決方案一樣縮小范圍,直到它“不准確”為止。 在那之后,您將很遺憾地需要在這些行上逐一搜索。

我會盡力為您構建合適的代碼:

lines = <All of your lines, considering you can index them>
givenstring = <Your string>
low = 0
high = len(lines)
i = 0
lastinstance = len(lines)

while i < len(givenstring)-1:
    #Finding the first instance:
    while low < high:
        mid = (low+high)//2
        if (mid == 0 or ord(givenstring[i]) > ord(lines[mid-1][i])) and ord(lines[mid][i]) == ord(givenstring[i]):
            firstinstance = mid
            break
        elif ord(givenstring[i]) > ord(lines[mid][i]):
            low = mid + 1
        else:
            high = mid

    #Finding the last instance:
    low = firstinstance
    high = lastinstance

    while low < high:
        mid = (low+high)//2
        if (mid == len(lines)-1 or ord(givenstring[i]) < ord(lines[mid+1][i])) and ord(lines[mid][i]) == ord(givenstring[i]):
            lastinstance = mid
            break
        elif ord(givenstring[i]) > ord(lines[mid][i]):
            low = mid + 1
        else:
            high = mid

    low = firstinstance
    high = lastinstance
    i += 1


print(firstinstance)
print(lastinstance)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM