2012-08-24 113 views
0

是否可以逐行搜索TextFile以查找特定字符串。 即。你好 它一行一行地查找是否有任何一行有Hello。每行只有一個字符串。 這可能嗎? 如果是這樣,我該如何嘗試?搜索具有特定字符串的行的文本文件

+5

準備好將整個文件加載到內存中,還是需要將其加載到較小的塊中? –

回答

7

將整個文件加載到內存當然是最容易的。只要您的文件足夠小,那麼你可以做這樣的:

found := false; 
sl := TStringList.Create; 
try 
    sl.LoadFromFile(fileName); 
    for line in sl do 
    if Pos('Hello', line)<>0 then 
    begin 
     found := true; 
     break; 
    end; 
finally 
    sl.Free; 
end; 

我認爲,當你說

如有線,它有你好

,你是尋找包含搜索字符串的行而不是等於搜索字符串的行。


在評論你問:

好吧我可以接着問,如果有可能問到 如何刪除從一個編輯框中鍵入了一個文件的字符串?所以 你輸入一個字符串到編輯框然後它搜索文件 它並刪除該行?

這是上面的一個很容易變化:

procedure RemoveLinesContaining(const fileName, searchText: string); 
var 
    sl: TStringList; 
    i: Integer; 
begin 
    sl := TStringList.Create; 
    try 
    sl.LoadFromFile(fileName); 
    for i := sl.Count-1 downto 0 do 
     if Pos(searchText, sl[i])<>0 then 
     sl.Delete(i); 
    sl.SaveToFile(fileName); 
    finally 
    sl.Free; 
    end; 
end; 

此功能刪除包含搜索字符串所有線。如果您只想刪除第一個這樣的行,那麼在調用Delete之後跳出for循環。

循環變量降序以允許循環修改列表。

如果你想使用不同的測試,說平等而不是包含,然後簡單地修改if語句。

+1

+1這個假設可能是正確的,但我在閱讀問題時錯過了。 – jpfollenius

1

一個簡單的方法是使用TStringList.LoadFromFile加載文件,然後檢查IndexOf('hello') - 如果它大於-1,則字符串在文件中。

var 
    sl : TStringList; 
    ix : Integer; 
begin 
    sl := TStringList.Create; 
    try  
    sl.LoadFromFile('test.txt'); 
    ix := sl.IndexOf('Hello'); 
    if ix > -1 then ShowMessage('Yup, the file contains a greeting.'); 
    finally 
    sl.Free; 
    end; 
end; 
+2

如果你使用'try''' finally代碼會更好# – jpfollenius

+0

Ok我可以問一下是否可以問如何刪除從文件中的編輯框輸入的字符串。 所以你輸入一個字符串到一個編輯框然後它搜索它的文件並刪除該行? –

+0

如果文件真的很大,你會用盡內存(@MattBiggs你應該首先回答David對你的問題的評論 –

相關問題