2012-08-24 4 views
0

Est-il possible de rechercher une chaîne de caractères par ligne pour trouver une chaîne spécifique? ie. Hello Il recherche ligne par ligne pour trouver si une ligne contient Hello. Il n'y aura qu'une seule chaîne par ligne. Est-ce possible? Si oui, comment puis-je tenter cela?Rechercher TextFile for Line avec une chaîne spécifique

+5

Êtes-vous prêt à charger le fichier entier en mémoire, ou avez-vous besoin de le charger en plus petits morceaux? –

Répondre

7

Il est certainement plus facile de charger le fichier entier en mémoire. A condition que votre fichier est assez petit, vous pouvez le faire comme ceci:

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; 

Je suppose que lorsque vous dites

si une ligne a Bonjour dans ce

que vous êtes rechercher des lignes contenant la chaîne de recherche plutôt que des lignes égales à la chaîne de recherche.


Dans un commentaire, vous demandez:

Ok je peux demander alors s'il serait possible de demander sur la façon de supprimer une chaîne qui est tapé à partir d'une zone d'édition d'un fichier? Donc, vous entrez une chaîne dans une zone d'édition, puis il recherche le fichier et supprime cette ligne?

C'est une variation assez facile de ce qui précède:

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; 

Cette fonction supprime toutes lignes contenant la chaîne de recherche. Si vous souhaitez uniquement supprimer la première ligne, quittez la boucle for après l'appel de Delete.

La variable de boucle descend pour permettre à la boucle de modifier la liste.

Si vous souhaitez utiliser un test différent, dites égalité plutôt que contient, puis modifiez simplement l'instruction if.

+1

+1 pour l'hypothèse qui est probablement juste mais que j'ai manqué en lisant la question. – jpfollenius

1

Un moyen facile est d'utiliser TStringList.LoadFromFile pour charger le fichier, puis vérifiez IndexOf('hello') - si elle est supérieure à -1, la chaîne est dans le fichier.

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

Le code +1 serait encore meilleur si vous utilisiez 'try' ...' finally' – jpfollenius

+0

Ok, puis-je demander s'il serait possible de demander comment supprimer une chaîne tapée dans une boîte d'édition d'un fichier. Donc, vous entrez une chaîne dans une boîte d'édition, puis il recherche le fichier et supprime cette ligne? –

+0

Vous manquez de mémoire si le fichier est vraiment gros (@MattBiggs vous devez d'abord répondre au commentaire de David sur votre question –

Questions connexes