Rechercher dans un fichier TXT une valeur [Résolu]

Messages postés
16
Date d'inscription
lundi 25 août 2003
Dernière intervention
4 mai 2008
- 20 janv. 2008 à 14:03 - Dernière réponse :
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 4 févr. 2008 à 22:35
moi je debute et franchement c pas evident mais
voila je souhaite rechercher dans un fichier TXT une valeur que j'aurais taper
dans Tedit afin de recuperer l'adresse IP associé
exemple chercher TXT

0000 10.25.36.15
0001 10.25.34.56
........
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Messages postés
16
Date d'inscription
lundi 25 août 2003
Dernière intervention
4 mai 2008
- 21 janv. 2008 à 19:19
3
Merci
tu avais raison cantador la nuit porte conseil
j'ai meme fais quelque modif

procedure TForm1.Button1Click(Sender: TObject);
var
Contents:TStringList;
find:boolean;
i:integer;
MonChamp:String;
begin
  find:=false;
  Contents:=TStringList.Create;
  try
    Contents.LoadFromFile('C:\install\liste.txt');  //Chargement du fichier
    i:=0;
    repeat
     if Pos(Edit1.Text, Contents[i]) > 0 then
       find:=true
     else
       i:=i+1;
    until ((find) or (i=Contents.Count));


    if find then
      MonChamp:=Contents[i];


    if AnsiContainsText(MonChamp, Edit1.text) then


       begin       // si la chaine contient la recherche
         Edit2.text := RightStr(Monchamp,Length(MonChamp)- Pos(' ',MonChamp));   // recuperation de la partie a droite du caractère "espace"


         Exit;   // sortir de la boucle




  end


  else
  ShowMessage('pas dans la liste')


     finally
    Contents.free;
end;
end;
end.

et voila ca marche j'ai bien mon message !!!!

maintenant il me faut mettre cette IP dans autre autre fichier a une place donner donc j'ai plus cas taffer
MERCI pour tous

Merci promenneur77 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de promenneur77
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 20 janv. 2008 à 17:25
0
Merci
->>>> recherche de chaîne dans chaîne :

il existe des fonctions qui le font directement
comme par exemple AnsiContainsText.
Commenter la réponse de cs_cantador
Messages postés
16
Date d'inscription
lundi 25 août 2003
Dernière intervention
4 mai 2008
- 20 janv. 2008 à 19:06
0
Merci
j'ai trouver une solution qui marche mais
procedure TForm1.Button1Click(Sender: TObject);
var
Contents:TStringList;
find:boolean;
i:integer;
begin
  find:=false;
  Contents:=TStringList.Create;
  try
    Contents.LoadFromFile('C:\test\test.txt');
    i:=0;
    repeat
     if Pos(Edit1.Text, Contents[i]) > 0 then
       find:=true
     else
       i:=i+1;
    until ((find) or (i=Contents.Count));
 end;
end;

mais maintenant faut que j'arrive a modifier les donner dans "contents" car si je l'affiche ca me donne "0000 10.25.36.15" et en faite j'ai juste besion de "10.25.36.15" afin de le meme dans un autre fichier
Commenter la réponse de promenneur77
Messages postés
168
Date d'inscription
mercredi 8 octobre 2003
Dernière intervention
10 novembre 2008
- 20 janv. 2008 à 19:35
0
Merci
Salut,

voici ce que je te propose

procedure TForm1.Button1Click(Sender: TObject);
var
  Contents:TStringList;
  sVar : string;
  i:integer;
begin
  Contents:=TStringList.Create;
  try
    Contents.LoadFromFile('C:\test\test.txt');    //Chargement du fichier
    for i := 0 to Contents.count -1 do                // Parcours de fichier
    begin
       sVar := Contents[i];                      // Recuperation de la chaine du fichier
       if AnsiContains(sVar, Edit1.text) then        
       begin       // si la chaine contient la recherche
         Edit2.text := AnsiRightStr(sVar,Length(sVar)- Pos(' ',sVar));   // recuperation de la partie a droite du caractère "espace"
         Exit;    // sortir de la boucle
      end;
  end;
end;

Voila j'ai pas testé car j'ai pas de delphi sous la main donc peut etre quelques modif de code a faire mais voila l'idée générale.

Bonne Prog
Commenter la réponse de moldov
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 20 janv. 2008 à 19:55
0
Merci
@moldov:
oui mais faut pas tout donner d'un seul coup..

et si le blanc un jour disparaît ?
Commenter la réponse de cs_cantador
Messages postés
16
Date d'inscription
lundi 25 août 2003
Dernière intervention
4 mai 2008
- 20 janv. 2008 à 20:05
0
Merci
a non le ' ' ne disparaitera jamais je vais test ce que tu ma mis moldov avec mes remerciements
Commenter la réponse de promenneur77
Messages postés
16
Date d'inscription
lundi 25 août 2003
Dernière intervention
4 mai 2008
- 20 janv. 2008 à 20:26
0
Merci
petit pb de declaration sur AnsiContains et AnsiRightStr

tu peut me dire c'est de quel type ?
Commenter la réponse de promenneur77
Messages postés
16
Date d'inscription
lundi 25 août 2003
Dernière intervention
4 mai 2008
- 20 janv. 2008 à 21:26
0
Merci
j'ai rajouter dans use : StrUtils
mais c toujour pareil
je comprend pas
Commenter la réponse de promenneur77
Messages postés
16
Date d'inscription
lundi 25 août 2003
Dernière intervention
4 mai 2008
- 20 janv. 2008 à 21:44
0
Merci
j'ai trouver MERCI :

procedure TForm1.Button1Click(Sender: TObject);
var
  Contents:TStringList;
  sVar : string;
  i:integer;


begin
  Contents:=TStringList.Create;
  try
    Contents.LoadFromFile('C:\install\liste.txt');    //Chargement du fichier
    for i := 0 to Contents.count -1 do                // Parcours de fichier
    begin
       sVar := Contents[i];                      // Recuperation de la chaine du fichier
       if AnsiContainsText(sVar, Edit1.text) then


       begin       // si la chaine contient la recherche
         Edit2.text := RightStr(sVar,Length(sVar)- Pos(' ',sVar));   // recuperation de la partie a droite du caractère "espace"


         Exit;   // sortir de la boucle


     end;
     end;
  finally
    Contents.free;


end;


end;
end.

en faite il fallais mettre strutils dans use
et utiliser AnsiContainsText a la place de AnsiContains  ainsi que  RightStr a la place de AnsiRightStr

et voila ca mache

par contre je voulais rajouter :

else ShowMessage('pas dans la liste');  si la valeur tape dans edit1.text n'existais pas mais je n'arrive pas a le placer

MERCI D'AVANCE
Commenter la réponse de promenneur77
Messages postés
168
Date d'inscription
mercredi 8 octobre 2003
Dernière intervention
10 novembre 2008
- 20 janv. 2008 à 21:50
0
Merci
Re,


Désolé Contador d'avoir directement donné la reponse.


Sinon pour ton probleme de pas dans la liste, il faut que tu mette un flag a flase au debut et a true si i rentre dans la condition et faire un test a la fin de la boucle afin de tester son état et afficher le message si necessaire..... Je te laisse chercher.

Bonne Prog
Commenter la réponse de moldov
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 20 janv. 2008 à 22:22
0
Merci
La nuit porte conseil..

ron ron ron....

cantador
Commenter la réponse de cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 21 janv. 2008 à 19:43
0
Merci
@
promenneur77



Bien le repeat until même un poil + rapide que la boucle..


bravo !

cantador
Commenter la réponse de cs_cantador
Messages postés
51
Date d'inscription
mardi 8 octobre 2002
Dernière intervention
21 décembre 2011
- 24 janv. 2008 à 16:24
0
Merci
Si le fichier fait plusieurs Mo, avec une TStringList, tu charge alors plusieurs Mo en mémoire, voici une fonction qui recherche dans un fichier une chaine, et renvoie sa position, j'ai la même fonction pour les fichiers de plus de 2Go ...

{* -----------------------------------------------------------------------------
la Fonction SearchStringInFile Permet de Chercher une Chaine dans Fichier, la fonction renvoi le nombre d'occurence, et peu renvoyer un tableau contenant le premier octet de chaque occurence dans le fichier
@param FileName Chaine contenant le nom du Fichier
@param SearchString Chaine à chercher dans le fichier
@param OffSets Tableau d'Entier qui contiendra les positions de occurences trouvés
@param KeepOffSet Boolean True rempli OffSets, False, ne rempli pas OffSets
@param CaseSensitive Boolean True A est différent de a, False, ignore la casse (plus lent)@param AcceptOverlap Boolean True si le mot à chercher est une répétition cela compte les occurences qui se chevauche, False chaque lettre d'une occurence ne peut être comptabilisé qu'une seule fois (exemple on chercher coco, le fichier contient cocococo, True 3, False 2)
@return Nombre d'occurence Trouvé
------------------------------------------------------------------------------ }function SearchStringInFile(const FileName: string; SearchString: string; out OffSets: TIntegerDynArray; KeepOffSet: Boolean False; CaseSensitive: Boolean True; AcceptOverlap: Boolean = False): Integer;
const
   BUF_SIZE: Integer = 1024;
var
   FileToSearch: file;
   SearchBuf: array of Char;
   iSearchBufPos, iSearch, iMark, iCountFound, iRememberFound, iReaded: Integer;
   SearchLen: Integer;
   AmtTransferred: Integer;
   FileModeCopy: Byte;
   LastFound: Boolean;
begin
   SearchLen := Length(SearchString);



   Result := 0;
   if SearchLen <= 0 then
     Exit;



   SetLength(SearchBuf, BUF_SIZE);
   iReaded := 0;



   if not CaseSensitive then
     SearchString := SysUtils.UpperCase(SearchString);



   FileModeCopy := FileMode;
   FileMode := SysUtils.fmOpenRead;
   try
     AssignFile(FileToSearch, FileName);
     Reset(FileToSearch, 1);
     try
        iCountFound := 0;



        while not Eof(FileToSearch) do
        begin
           BlockRead(FileToSearch, SearchBuf[0], BUF_SIZE, AmtTransferred); // [0] parce que c'est un tableau dynamique
           iRememberFound := iCountFound;
           iSearchBufPos := 0;
           LastFound := False;



           while iSearchBufPos < AmtTransferred do
           begin
              // Comparaison Octet par Octet de la chaine recherchée
              for iMark := iCountFound + 1 to SearchLen do
              begin
                 iSearch := iSearchBufPos + iMark - iRememberFound - 1;
                 if iSearch >= AmtTransferred then
                    Break;



                 if (CaseSensitive and (SearchBuf[iSearch] = SearchString[iMark]))
                 or (not CaseSensitive and (UpCase(SearchBuf[iSearch]) = SearchString[iMark])) then
                 begin
                    Inc(iCountFound);



                    LastFound := iCountFound >= SearchLen;
                    if LastFound then
                    begin
                       Inc(Result);
                       if KeepOffSet then
                       begin
                          SetLength(OffSets, Length(OffSets) + 1);
                          OffSets[High(OffSets)] := iReaded + iSearchBufPos - iRememberFound;
                       end;
                       iCountFound := 0;
                       iRememberFound := 0;
                       Break;
                    end;
                 end else begin
                    iCountFound := 0;
                    iRememberFound := 0;
                    Break;
                 end;
              end;



              if iSearch >= AmtTransferred then
                Break;



              if LastFound then
              begin
                LastFound := False;
                if AcceptOverlap then
                  Inc(iSearchBufPos, 1)
                else
                  Inc(iSearchBufPos, SearchLen)
              end
              else
                Inc(iSearchBufPos, 1);
           end;
           Inc(iReaded, AmtTransferred);
        end;
     finally
        CloseFile(FileToSearch);
     end;
   finally
     FileMode := FileModeCopy;
   end;
end;







Shai Le Troll
!! Aide via F1 !! Pensez-y !! 
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer
Commenter la réponse de cs_Shai
Messages postés
13
Date d'inscription
lundi 30 juillet 2007
Dernière intervention
6 février 2008
- 28 janv. 2008 à 17:39
0
Merci
AIDEZ MOI SVP ET MERCI

je suis debutant en DELPHI et j'ai un code fait en VB que j'aime bien traduire en delphi
j'ai fait un edit1 edit2 et un bouton ok
je rentre la densite dans edit1 ok je recois la dose dans edit2
voila le code en VB
Dim d(10), t(10) 'd signifie dose et t signifie densité

Dim j, s ' les compteurs

' Tsn densité sous etain et Dgamma dose
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??> 

d(0) = 0

d(1) = 25

d(2) = 50

d(3) = 100

d(4) = 200

d(5) = 400

d(6) = 800

d(7) = 1000

d(8) = 2000

d(9) = 4000

d(10) = 8000

 

t(0) = 0

t(1) = 6

t(2) = 13

t(3) = 22

t(4) = 45

t(5) = 86

t(6) = 119

t(7) = 166

t(8) = 263

t(9) = 356

t(10) = 453
Tsn InputBox("ENTREZ <?xml:namespace prefix st1 ns = "urn:schemas-microsoft-com:office:smarttags" /??><st1:personname w:st="on" productid="LA DENSITE F">LA DENSITE F</st1:personname>", "CALCUL GAMMA", 0)

Select Case Tsn

Case 0 To 5

s = 1

Case 6 To 12

s = 2

Case 13 To 21 '74 to 137

s = 3

Case 22 To 44

s = 4

Case 45 To 85

s = 5

Case 86 To 118

s = 6

Case 119 To 165

s = 7

Case 166 To 328

s = 8

Case 329 To 355

s = 9

Case 356 To 453

s = 10

Case Is > 453

Exit Function

End Select

MsgBox s

Select Case s

Case 1

Dgamma = ((d(s) - d(s - 1)) / (t(s) - t(s - 1)) * (Tsn)) + d(s - 1)    //   c'est la formule de calcul 1

Case 2 To 7

Dgamma = (((d(s) - d(s - 1)) / (t(s) - t(s - 1)) * (Tsn)) + (d(s - 1) - ((d(s) - d(s - 1)) / (t(s) - t(s - 1))) * (t(s - 1))))    // c'est la formule de calcul 2

Case 8, 9

Dgamma = d(s - 1) * Log(1 - ((2 * t(s - 1) - t(s))) * Tsn / (t(s - 1) ^ 2)) / Log(t(s) / t(s - 1)) - 1 // c'est la formule de calcul 3

End Select

DG = Dgamma(f)

MsgBox DG & " " & "mrem"
Commenter la réponse de piratos3
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 28 janv. 2008 à 20:03
0
Merci
"je rentre la densite dans edit1 ok je recois la dose dans edit2"

Attention à ne pas dépasser la dose !

cantador
Commenter la réponse de cs_cantador
Messages postés
51
Date d'inscription
mardi 8 octobre 2002
Dernière intervention
21 décembre 2011
- 29 janv. 2008 à 11:41
0
Merci
Quel est le rapport avec le sujet d'origine ?









var
  D, I: array[0..10] of Integer;
  Tsn: Integer
begin
d[0] := 0
d[1] := 25
d[2] := 50;
d[3] := 100;
d[4] := 200;
d[5] := 400;
d[6] := 800;
d[7] := 1000;
d[8] := 2000;
d[9] := 4000;
d[10] := 8000;



t[0] := 0;
t[1] := 6;
t[2] := 13;
t[3] := 22;
t[4] := 45;
t[5] := 86;
t[6] := 119;
t[7] := 166;
t[8] := 263;
t[9] := 356;
t[10] := 453;
Tsn := StrToInt(InputBox('ENTREZ LA DENSITE F', 'CALCUL GAMMA', 0)); // ou InputQuery ???



Case Tsn of
  0..5 : s := 1;
  6..12 : s := 2;
  13..21, 74..137 : s := 3;
...
else
  Exit;
End;



Après cela ne change pas grand chose, le = est remplacé par :=











<hr />
Shai Le Troll
!! Aide via F1 !! Pensez-y !! 
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le conf
Commenter la réponse de cs_Shai
Messages postés
13
Date d'inscription
lundi 30 juillet 2007
Dernière intervention
6 février 2008
- 4 févr. 2008 à 18:55
0
Merci
merci beaucoup a toi shai je doit faire un essai est vous repondre
mille merci
Commenter la réponse de piratos3
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 4 févr. 2008 à 22:35
0
Merci
Dis donc Shai, ta fonction de recherche est très intéressante..

Pourrais-tu déposer un petit projet sur DelphiFr avec un exemple d'utilisation de ta fonction.

merci par avance

cantador
Commenter la réponse de cs_cantador

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.