IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Récupérer des infos précise (nombre) dans un fichier texte


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut Récupérer des infos précise (nombre) dans un fichier texte
    Bonjour,

    Je voudrais récupérer des nombres dans un fichier texte de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    frame=  623 fps= 54 q=31.0 size=    2141kB time=20.62 bitrate= 850.5kbits/s    
    frame=  647 fps= 143 q=31.0 size=    220kB time=21.39 bitrate= 861kbits/s    
    frame=  672 fps= 122 q=31.0 size=    2639kB time=22.24 bitrate= 872.5kbits/s    
    frame=  696 fps= 122 q=31.0 size=    2490kB time=23.08 bitrate= 883.9kbits/s    
    frame=  719 fps= 121 q=24.8 size=    2597kB time=23.85 bitrate= 1192.0kbits/s    
    frame=  740 fps= 76 q=24.8 size=    272kB time=24.54 bitrate= 901.8kbits/s    
    frame=  763 fps= 211 q=31.0 size=    2822kB time=25.29 bitrate= 1114.3kbits/s    
    frame=  786 fps= 5 q=31.0 size=    27kB time=26.12 bitrate= 924.2kbits/s    
    frame=  812 fps= 0.3 q=31.0 size=    6kB time=26.96 bitrate= 930.0kbits/s    
    frame=  836 fps= 1 q=31.0 size=    2323362kB time=127.75 bitrate= 1133.4kbits/s
    C'est en faite un fichier log.txt d'un programme exterieur,
    une ligne est ajoutée chaque seconde.

    moi je voudrais récupérer donc a chaque seconde la dernière ligne (jusqu'ici je sais faire),
    mon problème c'est comment récupérer juste les nombres sachant que je ne connais pas leur taille (ça peut varier de 1 a xxxxx chiffres voir +...)


    Par exemple : frame= 623 fps= 54 q=31.0 size= 2141kB time=20.62 bitrate= 850.5kbits/s

    je voudrais récupérer 623, 54, 850.5

    puis 1 seconde après : frame= 647 fps= 143 q=31.0 size= 220kB time=21.39 bitrate= 861kbits/s

    647, 143, 861 ect...

    merci !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour

    Essayer la fonction pos.

    I := Pos('fram=', Maligne);

    Si I = -1, la ligne ne contient pas 'fram='.
    Si I = n le f de 'fram=' est en position n (ligne[n] = 'F')
    du coup vous pouvez teste vos caractère à partire de (n + 5) pour trouver votre nombre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    function trouverframdans maligne(ligne: string): integer;
    var
      I, II: integer;
      Tmp: string;
    begin
      I := pos('fram=', ligne);
      if I = -1 then begin
        result := 0
      end else begin
        Tmp := '';
        for II := I + 5 to length(ligne) do begin
           if (Ligne[II] = '0') or (Ligne[II]= '1' ) etc de 1 à 9 plus ' ' then
              TMP := TMP + Ligne[II]
           else break;
         end;
         I := StrToIntDef(trim(TMP), 0);
        end;
      end;
    end;

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    la meilleur solution, je pense est de parcourir ta ligne de droite à gauche.

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Ou avec une conversion de ligne en colonne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    procedure TForm4.Decode(aLine: string);
    var
      List :TStringList;
     
      //Remplace l'espace précédent par un retour à la ligne
      procedure Replace(aText :string);
      begin
        aText := aText +'=';
        aLine := StringReplace(aLine, ' ' +aText, #13 +aText, [rfIgnoreCase]);
      end;
      //
     
    begin
      //Conversion
      Replace('fps');
      Replace('q');
      Replace('size');
      Replace('time');
      Replace('bitrate');
     
      List := TStringList.Create;
      try
        //Chargement de la liste
        List.Text := aLine;
     
        //Lecture
        Frame   := List.Values['frame'];
        Fps     := List.Values['fps'];
        BitRate := List.Values['bitrate'];
      finally
        List.Free;
      end;
    end;

  5. #5
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Je pense qu'avec Pos, tu pourrais facilement t'en sortir ...
    Par exemple, tu cherches le premier espace, Puis tu enregistre les caracteres suivants jusqu'a l'espace, et t'auras ton nombre !

    Bonne chance !!

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    Merci pour vos réponses

    Bon avec Pos je n'y arrive pas, Tardiff Jean-François t'as méthode est bien
    mais je n'arrive pas a l'appliquer car je ne connais pas la longueur de mon nombre, qui peut aller de 1 a 15 caractère voir +,
    et surtout derrière il y a des infos collées > 1133.4kbits/s


    Andnotor > j'y suis arrivé avec ta méthode merci
    petite question : peut on optimiser ton code ?

    peut être que je ne devrais pas créer a chaque fois List et la détruire avec List.Free, mais simplement la créer une fois et faire un List.Clear; ?

    merci

  7. #7
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Pos sert a trouver une chaine dans une autre. Supposons que tu sais ou commence ton chiffre : par exemple a la position 5 de ligne (var de type string), tu fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Txt:=Ligne;
     
    //Efface le début du string jusqu'a ton chiffre
    Delete(Txt,1,5);
     
    //Repere le caractere espace : dans ta ligne, tes chiffres finissent presque tous par un espace :
    //longueur correspond alors au nombre de chiffres de ta valeur +1
    Longueur := Pos(' ', Txt);
     
    //Enlever la fin de la ligne a partir de l'espace apres la valeur
    Delete(Txt,Longueur, Length(Txt)-Longueur);
     
    // ici , Txt contient seulement ta valeur
    Pour ta derniere valeur, au lieu de rechercher un espace, il suffit de rechercher un 'k' !!

    Ensuite, pour trouver le début de ton chiffre, il suffit de trouver par exemple 'fps=' et d'ajouter 4 (ton chiffre commence 4 caracteres apres le f) ...

    J'espere que maintenant tu sauras te servir de Pos

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    peut être que je ne devrais pas créer a chaque fois List et la détruire avec List.Free, mais simplement la créer une fois et faire un List.Clear; ?
    S'il s'agissait de la conversion complête d'un fichier, tu pourrais. Mais pour une ligne à la seconde, ce n'est pas nécessaire.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 85
    Points
    85
    Par défaut
    ok merci mick605

    Voila mon code :

    Edit0.text := ' frame= 623 fps= 54 q=31.0 size= 2141kB time=20.62 bitrate= 850.5kbits/s'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    var
    fps, time, bitrate : string;
    x : integer;
    begin
    //recherche fps
    fps := edit0.Text;
    x := Pos('fps=',fps);
    Delete(fps,1,x+4); // Delete Debut
    x := Pos(' ',fps);
    Delete(fps,x,length(fps)-x+1); // Delete Fin
     
    //recherche time
    time := edit0.Text;
    x := Pos('time=',time); 
    Delete(time,1,x+4); // Delete Debut
    x := Pos(' ',time);
    Delete(time,x,length(time)-x+1); // Delete Fin
     
    //recherche bitrate
    bitrate := edit0.Text;
    x := Pos('bitrate=',bitrate);
    Delete(bitrate,1,x+8); // Delete Debut
    x := Pos('kbits',bitrate);
    Delete(bitrate,x,length(bitrate)-x+1); // Delete Fin
     
     
    edit1.Text := fps;
    edit2.Text := time;
    edit3.Text := bitrate;
    Faut que je compare pour savoir quel est la méthode la + rapide,
    avec une conversion de ligne en colonne ou avec Pos

  10. #10
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Ok, si tu as la réponse, fais nous signe, j'aimerais savoir !

    Et si t'as encore besoin d'aide, dis le nous !

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Ou alors par pointeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    function Parse(var PStart :PChar) :string;
    var
      PEnd  :PChar;
      Count :integer;
    begin
      while not (PStart^ in ['0'..'9']) do
        inc(PStart);
     
      PEnd := PStart +1;
      while PEnd^ in ['0'..'9', '.'] do
        inc(PEnd);
     
      Count := PEnd -PStart;
      SetLength(Result, Count);
      StrLCopy(PChar(Result), PStart, Count);
     
      inc(PStart, Count +1);
    end;
     
    procedure TForm2.Button1Click(Sender: TObject);
    var
      P :PChar;
    begin
      P       := PChar(Edit0.Text);
      Frame   := Parse(P);
      Fps     := Parse(P);
      Q       := Parse(P);
      Size    := Parse(P);
      Time    := Parse(P);
      BitRate := Parse(P);
    end;

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ AndNotOr, oufti, la tu te surpasses, excellent ta fonction !

    @ +,

    Cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer des réels non NaN dans un fichier
    Par jyloup dans le forum Fortran
    Réponses: 8
    Dernier message: 05/12/2012, 08h31
  2. Réponses: 4
    Dernier message: 10/04/2008, 22h23
  3. recupérer un nombre dans un fichier texte
    Par coincoin22 dans le forum Linux
    Réponses: 10
    Dernier message: 13/08/2007, 11h37
  4. Réponses: 10
    Dernier message: 23/04/2007, 14h18
  5. Réponses: 1
    Dernier message: 11/06/2006, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo