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

Langage Delphi Discussion :

traitement d'une trame fichier


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 63
    Points : 31
    Points
    31
    Par défaut traitement d'une trame fichier
    Bonjour,
    Je veux traiter un fichier txt comme suite :
    le contenu du fichier :
    France 978EUR000000100000000000077918000001108361 0000000000000000000000001212
    French Guiana 978EUR000000100000000000077918000001108361 0000000000000000000000001212
    French Polynesia 953XPF000011933170000009298132000000009288 0000000000000000000000001212

    Ce que je veux est simple mais je bloque!!
    1) Par exemple pour: 978EUR000000100000000000077918000001108361 je dois prendre les 7 derniers chiffres 1108361 pour les diviser/10 000 pour avoir = 110.8361 et ainsi de suite..
    2) Prendre le code devise, du 4ème au 6ème caractère de la trame.
    3) Mettre tous cela dans un fichier csv

    Merci pour l'aide

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,
    Citation Envoyé par ameno_123 Voir le message
    Ce que je veux est simple mais je bloque!!
    Et si vous nous montriez ce que vous avez fait, que l'on puisse vous indiquer ce qui ne va pas pour que vous le corrigiez ensuite ?
    A moins que vous attendiez que l'on travaille pour vous ?
    Citation Envoyé par ameno_123 Voir le message
    1) Par exemple pour: 978EUR000000100000000000077918000001108361 je dois prendre les 7 derniers chiffres 1108361 pour les diviser/10 000 pour avoir = 110.8361 et ainsi de suite..
    Voici une piste
    Unité StrUtils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
    function RightStr(const AText: WideString; const ACount: Integer): WideString; overload;
    Citation Envoyé par ameno_123 Voir le message
    2) Prendre le code devise, du 4ème au 6ème caractère de la trame.
    Voici une autre piste
    Unité System
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Copy(S: String; Index, Count: Integer);
    Citation Envoyé par ameno_123 Voir le message
    3) Mettre tous cela dans un fichier csv
    Regardez l'aide de Delphi pour
    Unité System
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    procedure AssignFile(var F; FileName: String);
    procedure CloseFile(var F);
    procedure WriteLn([var F:Text;] P1 [,P2,...,Pn ]);

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 63
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup pour votre aide, mais a vrai dire j'ai rien développé , je suis que débutant

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 63
    Points : 31
    Points
    31
    Par défaut
    J'ai évolué un peu mais je bloque :
    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
    var i,n : integer;
        ch  : string;
        FichierEleves : TStringList;
        tachaine : WideString;
        tachaine2 : array of string;
    begin
       FichierEleves:=TStringList.Create;
       if OpenTextFileDialog1.Execute then
       begin
     
          FichierEleves.LoadFromFile(OpenTextFileDialog1.FileName);
        statusbar1.Panels[1].Text:=inttostr(FichierEleves.Count-1);
        SetLength(tachaine2, 1);
         // for i:=1 to 39 do grEleves.Rows[i].clear;
          for n:=0 to FichierEleves.Count-1 do
          begin
             ch:=FichierEleves[n];
             tachaine := ch;
             while Pos(' ', tachaine) > 0 do
    begin
    tachaine2[Length(tachaine2)-1] := trim(copy(tachaine,0, Pos(' ', tachaine))) ;
     
    delete (tachaine,1, length(copy(tachaine,0, Pos(' ', tachaine)) ));
    SetLength(tachaine2, length(tachaine2)+1);
    memo1.Lines.Add(tachaine2[0]);
    end;
    j'ai essayé d’éclaté mon fichier comme suite mais sans résultat:
    tachaine2[1]:='France'
    tachaine2[2]:= '978EUR000000100000000000077918000001108361'

  5. #5
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Citation Envoyé par ameno_123 Voir le message
    J'ai évolué un peu mais je bloque :
    Je vois que dans votre boucle, vous bloquez sur le 1° élément de tachaine2.
    cf. ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //memo1.Lines.Add(tachaine2[0]);
    Memo1.Lines.Add(tachaine2[Length(tachaine2) - 2]);
    Bonne continuation...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 63
    Points : 31
    Points
    31
    Par défaut
    Merci pour votre aide.
    Effectivement sur mon memo j'ai le pays ainsi que les valeurs, alors que moi je cherche a les éclater pour faire un traitement sur chaque valeur et enregistre le tout sur un fichier de sortie pour avoir cette trame :

    trame originale :
    France 978EUR000000100000000000077918000001108361

    trame de sortie :
    France EUR 1108361

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 63
    Points : 31
    Points
    31
    Par défaut
    J'ai pu crée cette procedure qui marche à merveille:

    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
    procedure Acquisition;
    var List,LCSV: TstringList;
         i,idx:integer;
         chaine,champ:string;
         devise,valeur,pays:string;
    begin
      LIST := TStringList.create;
      LCSV := TStringList.create;
      LIST.loadfromfile('tonsource.dat');  // nom à adapter !!
      for i:=0 to LIST.count-1 do
        begin
          chaine := LIST[i];
          repeat
            idx := pos(' ',chaine);
            pays := trim(copy(chaine,0, Pos(' ', chaine))) ;
          //  pays:= trim(copy(chaine,1,idx));
            champ := trim(copy(chaine,1,idx));
            chaine := trim(copy(chaine,idx,999));
          until length(champ)>35;
          devise := copy(champ,4,3);
          valeur := copy(champ,length(champ)-6,7);
                //  + '.'
              //    + copy(champ,length(champ)-1,2);
          LCSV.add(pays+ ';' +devise + ';' + valeur);
        end;
      LCSV.savetofile('result.csv');
      LCSV.free;
      List.free;
    end;
    Je bloque sur la variable pays que je n'arrive pas a faire extraire correctement de ma ligne : France 978EUR000000100000000000077918000001108361

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par ameno_123 Voir le message
    J'ai pu crée cette procedure qui marche à merveille:

    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
    procedure Acquisition;
    var List,LCSV: TstringList;
         i,idx:integer;
         chaine,champ:string;
         devise,valeur,pays:string;
    begin
      LIST := TStringList.create;
      LCSV := TStringList.create;
      LIST.loadfromfile('tonsource.dat');  // nom à adapter !!
      for i:=0 to LIST.count-1 do
        begin
          chaine := LIST[i];
          repeat
            idx := pos(' ',chaine);
            pays := trim(copy(chaine,0, Pos(' ', chaine))) ;
          //  pays:= trim(copy(chaine,1,idx));
            champ := trim(copy(chaine,1,idx));
            chaine := trim(copy(chaine,idx,999));
          until length(champ)>35;
          devise := copy(champ,4,3);
          valeur := copy(champ,length(champ)-6,7);
                //  + '.'
              //    + copy(champ,length(champ)-1,2);
          LCSV.add(pays+ ';' +devise + ';' + valeur);
        end;
      LCSV.savetofile('result.csv');
      LCSV.free;
      List.free;
    end;
    Je bloque sur la variable pays que je n'arrive pas a faire extraire correctement de ma ligne : France 978EUR000000100000000000077918000001108361
    Il faut rendre à César ce qui appartient à César. Tu n'es pas l'auteur de ce code.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 532
    Points
    13 532
    Par défaut
    Country := TrimRight(Copy(Tmp, 1, Len - 71)) ne pourrait-il pas être simplement remplacé par Country := Copy(Tmp, 1, Len - 72)

    Bon, maintenant que nous avons bien ri avec nos copy/trim, voyons comment traiter ces données d'une façon un peu plus rapide et... professionnelle !
    Je vous fais grâce des boucles et chargement/sauvegarde.

    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
    function CreateCVSRow(aRow :string) :string;
    type
      PData = ^TData;
      TData = record
        N1   :array[0..2]  of char;
        Cur  :array[0..2]  of char;
        N2   :array[0..28] of char;
        Int  :array[0..2]  of char;
        Frac :array[0..3]  of char;
        N3   :array[0..28] of char;
      end;
     
    var
      P   :PData;
      Len :integer;
     
    begin
      Len       := Length(aRow) -SizeOf(TData) div SizeOf(Char);
      P         := @aRow[Len +1];
      aRow[Len] := #0;
      Result    := PChar(aRow) +',' +P.Cur +',' +P.Int +'.' +P.Frac;
    end;
    ps: mais c'est qui ce Cesar

Discussions similaires

  1. [Batch] traitement excluant une extension de fichier
    Par Vagabonerie dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 24/01/2011, 15h58
  2. Réponses: 1
    Dernier message: 29/01/2009, 12h18
  3. Identifier les valeurs d'une trame dans un fichier texte
    Par dreamnos dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 09/05/2008, 17h18
  4. Déclarer une trame de 9 octets dans un fichier .m
    Par berberat dans le forum MATLAB
    Réponses: 13
    Dernier message: 01/08/2007, 09h35
  5. Réponses: 18
    Dernier message: 22/06/2006, 17h55

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