Rechercher dans un fichier TXT une valeur

Résolu
promenneur77 Messages postés 16 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 4 mai 2008 - 20 janv. 2008 à 14:03
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 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
........

17 réponses

promenneur77 Messages postés 16 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 4 mai 2008
21 janv. 2008 à 19:19
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
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
20 janv. 2008 à 17:25
->>>> recherche de chaîne dans chaîne :

il existe des fonctions qui le font directement
comme par exemple AnsiContainsText.
0
promenneur77 Messages postés 16 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 4 mai 2008
20 janv. 2008 à 19:06
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
0
moldov Messages postés 165 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 10 novembre 2008
20 janv. 2008 à 19:35
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
20 janv. 2008 à 19:55
@moldov:
oui mais faut pas tout donner d'un seul coup..

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

tu peut me dire c'est de quel type ?
0
promenneur77 Messages postés 16 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 4 mai 2008
20 janv. 2008 à 21:26
j'ai rajouter dans use : StrUtils
mais c toujour pareil
je comprend pas
0
promenneur77 Messages postés 16 Date d'inscription lundi 25 août 2003 Statut Membre Dernière intervention 4 mai 2008
20 janv. 2008 à 21:44
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
0
moldov Messages postés 165 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 10 novembre 2008
20 janv. 2008 à 21:50
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
20 janv. 2008 à 22:22
La nuit porte conseil..

ron ron ron....

cantador
0
cs_Shai Messages postés 50 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 21 décembre 2011
24 janv. 2008 à 16:24
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
0
piratos3 Messages postés 13 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 6 février 2008
28 janv. 2008 à 17:39
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"
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 janv. 2008 à 20:03
"je rentre la densite dans edit1 ok je recois la dose dans edit2"

Attention à ne pas dépasser la dose !

cantador
0
cs_Shai Messages postés 50 Date d'inscription mardi 8 octobre 2002 Statut Membre Dernière intervention 21 décembre 2011
29 janv. 2008 à 11:41
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
0
piratos3 Messages postés 13 Date d'inscription lundi 30 juillet 2007 Statut Membre Dernière intervention 6 février 2008
4 févr. 2008 à 18:55
merci beaucoup a toi shai je doit faire un essai est vous repondre
mille merci
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
4 févr. 2008 à 22:35
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
0
Rejoignez-nous