Trier un fichier texte [Résolu]

Signaler
Messages postés
23
Date d'inscription
dimanche 24 août 2003
Statut
Membre
Dernière intervention
11 février 2007
-
Messages postés
23
Date d'inscription
dimanche 24 août 2003
Statut
Membre
Dernière intervention
11 février 2007
-
bonjour

voici un sujet qui s'approche de certains que j'ais deja pus lire .

J'ais un fichier txt avec des valeurs separe par des ";"
A chaques fin de ligne il y a un return
J'arrive a extraire mes lignes et les afficher dans un memo.
Mais maintenant je voudrais recuperer la 4eme valeur (16,456)qui se trouve entre les ;
ceci afin de tester cette valeur et la supprimer si elle est superieur au chiffre 100.

ex :12/12/2007;12:16:12;16,456;45

merci de votre aide
fabrice

9 réponses

Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
1
Salut,

utilise des Tstinglist

var
lig : TStringList;
begin

lig:= tstringlist.Create;

  lig.Delimiter:=';';

etc etc.......................

couf
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
1
RE,

Tu aurais corrigé de toi même
pas lig.Add(ligne)
mais lig.DelimitedText := ligne;

couf

Salut,

Deux remarques :

-
if OpenDialog1.FileName<>''  : ca ne sert a rien. Tu peux supprimer cette ligne car tu n'as pas d'autre choix que de sélectionner un fichier ou de fermer.

Secondo :

AssignFile(F, OpenDialog1.FileName) ;
Reset(F);
Texte:='';
Repeat
Readln(F, Ligne);
lig := Tstringlist.Create ;
lig.Delimiter:=';';
lig.LoadFromFile(OpenDialog1.FileName);
lig.Delimiter:=';';
D := lig.strings[3];
edit2.Text := D ;
end;

Ce qui a en rouge ne sert a rien : tu fais deux fois la meme chose.
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
1
Salut,

cela crève les yeux, je te laisse chercher un peu.
Un petit indice, "fais une boucle."

couf

PS: n'oublie pas de valider sur réponse accepter.
Messages postés
23
Date d'inscription
dimanche 24 août 2003
Statut
Membre
Dernière intervention
11 février 2007

Merci pour cette reponse

je viens d'essayer et le probleme est que je recupere toute la ligne(la 3 dans ce cas) et non pas le ce qui se trouve entre les ";"
voici mon code
procedure TForm1.Ouvrir1Click(Sender: TObject);
begin
OpenDialog1.Execute ; { Affichage de la boîte de dialogue d'ouverture }
if OpenDialog1.FileName<>'' then { si un fichier existant a été selectionner}
begin
AssignFile(F, OpenDialog1.FileName) ; { On assigne a F la valeur opendialog1.filename}
Reset(F); { On ouvre le fichier selectionner en lecture }
Texte:=''; { On définit que texte ne contient rien }
Repeat
Readln(F, Ligne);
lig := Tstringlist.Create ;
lig.Delimiter:=';';
lig.LoadFromFile(OpenDialog1.FileName);
lig.Delimiter:=';';
D := lig.strings[3];
edit2.Text := D ;
end;

merci de votre aide
fabrice
Messages postés
213
Date d'inscription
dimanche 5 janvier 2003
Statut
Membre
Dernière intervention
6 janvier 2011
1
Salut,

lig.LoadFromFile(OpenDialog1.FileName);

Je crois que cette ligne ne va pas
moi j'aurai plus fait un lig.Add(ligne);
D:=lig[2]
qui récupère la 3 ème valeur
si tu fait loadfromfile tu récupère tous le fichier.

ici  tu as un tutoriel assez bien fait en anglais
couf
Messages postés
23
Date d'inscription
dimanche 24 août 2003
Statut
Membre
Dernière intervention
11 février 2007

Bonjour a tous et merci de votre aide
effectivement avec lig.DelimitedText:= ligne  ca marche nickel.
Je vous joins le bout de code.
Par contre maintenant que j'arrive a isoler ma valeur je la transforme en float et je la teste.Si elle est supereiur a 100 je voudrais qu'elle s'affiche dasn le memo2.
Avec mon code j'arrive a afficher uniquement la derniere valeur > 100 et les autres ne sont pas affichées.comment cela se fait t il ?
de plus je voudrais effacer toutes les lignes qui contiennent une valeur > 100;
je vous joins le code

En vous remerciant
Fabrice

DecimalSeparator:=',' ;
Readln(F, Ligne);
lig := Tstringlist.Create ;
lig.Delimiter:=';';
lig.DelimitedText:= ligne ;
edit2.Text := lig.strings[2];
j := strtofloat(lig.Strings[2]);
if j>100 then
begin
memo2.Text :=lig.Strings[2]+chr(13)+chr(10);
end;


 


 


 


 


 


 
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
32
voici LA bonne methode :

begin
  if OpenDialog1.Execute then
     with TStringList.Create do
        try // on gere tout dans un Try Finally !
          LoadFromFile(OpenDialog1.FileName);
          Delimiter     := ';'; 
          DelimitedText := Text;

          { En delphi le travail sur les réels se font toujours
            en type Extended, ça tombe bien StrToFloat renvois un   
            extended et 100 serat egalement transtypé automatiquement
            dans ce type. Ne pas comparer par contre les types "Real"
            et "Double" sans les transtyper avant en extended ou
            en Single. }

          if StrToFloat(Strings[2]) > 100 then begin
             Self.Caption := 'Superieur a 100';
          end else begin
             Self.Caption := 'Inferieur ou egal a 100';
          end;

        finally
          free; // et on pense a liberer l'instance de la TStringList!
        end;
end;

<hr size="2" width="100%" />Croc (click me)
Messages postés
23
Date d'inscription
dimanche 24 août 2003
Statut
Membre
Dernière intervention
11 février 2007

Bonjour a tous

Je me suis remis sur mon prog pour obtenir enfin ce que je desirais.
Le tous n'est pas forcement optimiser mais bon ca marche.
Je voulais savoir egalement  si il etait possible d'integrer un graphique avec delphi.
Je signale que j'utilise delphi personel 6.
est il possible de rajouter les modules pour tracer les graphiques . Est il possible egalement d'ouvrir eventuelement excel pour tracer ledit graphique.

autrement ej vous livre le code source de mon appli qui est destinée a ouvrir un ficheir texte , de determiner si le 3eme champ est > a 100 .il creer 2 fichier texte , un avec les valeur erronées et l'autre avec les valeur vraie.Il compte egalement le nombre de valeurs erronnées.

merci a tous
fabrice

unit moulinette1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;


type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Fichier1: TMenuItem;
    Ouvrir1: TMenuItem;
    Quitter1: TMenuItem;
    OpenDialog1: TOpenDialog;
    memo1: TMemo;
    SaveDialog1: TSaveDialog;
    Label1: TLabel;
    Memo2: TMemo;
    Edit2: TEdit;
    Memo3: TMemo;
    Label2: TLabel;
    Edit1: TEdit;
    Label3: TLabel;
    procedure Quitter1Click(Sender: TObject);
    procedure Ouvrir1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
Type
    Adr = record
       N : String[20]  ;
       P : String[20]  ;
end;
var
  Form1: TForm1;
  F : TextFile ;
  G : TextFile ;
  H : TextFile ;
  Texte : String ;
  erreur : string ;
  vraie : string ;
  Ligne :String ;
  i : integer ;
  k : integer ;
  j : currency ;
  lig : Tstringlist ;
  total : string ;
  totaler : string ;


implementation


{$R *.dfm}


procedure TForm1.Quitter1Click(Sender: TObject);
begin
        Application.Terminate ;
end;


procedure TForm1.Ouvrir1Click(Sender: TObject);
begin
    OpenDialog1.Execute ;  { Affichage de la boîte de dialogue d'ouverture }
    if OpenDialog1.FileName<>'' then { si un fichier existant a été selectionner}
    begin
    AssignFile(F, OpenDialog1.FileName) ; { On assigne a F la valeur opendialog1.filename}
    Reset(F); { On ouvre le fichier selectionner en lecture }
    Texte:=''; { On définit que texte ne contient rien }
    i := 0 ;
    k := 0 ;
    Repeat
    DecimalSeparator:=',' ; {Définition du symbole décimal}
    Readln(F, Ligne);     {on lit F et on le stocke la ligne dans Ligne}
    lig := Tstringlist.Create  ;
     lig.Delimiter:=';';
     lig.DelimitedText:= ligne ;
    if (lig.Strings[2]<>'') then
    begin
     j := strtofloat(lig.Strings[2]);
     if j>100 then  {si J supérieur a 100 ecrire la valeur dans memo2.text}
     begin
     i := i+1 ;
     totaler := floattostr(i) ;
     edit2.Text := totaler;
     erreur:=erreur+lig.Strings[0]+';'+lig.Strings[1]+';'+lig.Strings[2]+chr(13)+chr(10);
     memo2.Text := erreur;
     Assignfile(G,'C:\erreur.txt');
     {$I-}
     Append(G);
     {$I+}
        if (IOresult=0) then
        begin
                Writeln(G,ligne);
                CloseFile(G);
        end
        else
        begin
                rewrite(G) ;
                Writeln(G,ligne);
                CloseFile(G);
        end
     end
     else
     begin
     k := k+1 ;
     total := floattostr(k) ;
     edit1.Text := total;
     vraie:=vraie+lig.Strings[2]+chr(13)+chr(10);
     memo3.Text := vraie;
     Assignfile(H,'C:\valeurvraie.txt');
     {$I-}
     Append(H);
     {$I+}
        if (IOresult=0) then
        begin
                Writeln(H,ligne);
                CloseFile(H);
        end
        else
        begin
                rewrite(H) ;
                Writeln(H,ligne);
                CloseFile(H);
        end
     end;
     end;
     Texte:=Texte+Ligne+chr(13)+chr(10);
     memo1.Text:=Texte;
    Until EOF(f);
    CloseFile(F);
    end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
        memo1.Clear ;
        memo2.Clear ;
        DeleteFile('C:\valeurvraie.txt');
        DeleteFile('C:\erreur.txt');
end;


end.