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 de fichier TXT compliquer


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut traitement de fichier TXT compliquer
    Bonjour, Bonsoir à toutes et à tous,

    J'ai besoin d'un coup de pied...oups de main, pour un traitement d'un fichier.
    J'ai un fichier de départ comportant une séquence répétitive donc détectable dans laquelle je doit regrouper des sequences... Qu'est ce qui raconte... lol

    voilà mon fichier :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    #MECG début de ligne
    VE  Code journal
    270508  Date de pièce
     Ligne vide
     Ligne vide
    00012081 // <-- Numéro de Pièce
     Ligne vide
    411  Compte
     Ligne vide
    17113C  je sais pas lol (pas important)
     Ligne vide
    Facture 00012081 LILI  libellé
     Ligne vide
    150808  Date d'échéance
     Ligne vide
     Ligne vide
     Ligne vide
    0  Sens de la somme 0 = débit 1 = crédit
    34095.21  Montant
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
    #MECG début de ligne
    VE  code journal 
    270508  Date de pièce
     Ligne vide
     Ligne vide
    00012081  Numéro de document
     Ligne vide
    7042000 // <-- Compte
     Ligne vide
     Ligne vide
     Ligne vide
    Facture 00012081 LILI  Libellé
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
    1  Sens de la somme 0 = débit 1 = crédit
    14895.93  Montant
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
    #MECG Nouvelle Ligne
    VE  code journal
    270508  Date pièce
     Ligne vide
     Ligne vide
    00012081  Numéro de pièce
     Ligne vide
    7042000 // <-- Numéro de compte identique au bloc précédent du dessus
     Ligne vide
     Ligne vide
     Ligne vide
    Facture 00012081 LILI  Libellé
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
    1  Sens de la somme 0 = débit 1 = crédit
    13611.77  Montant
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
    #MECG Nouvelle Ligne
    // ...  Etc ....
    // ...
    // ...
    #MECG Nouvelle ligne Mais ici on change de numéro de pièce
    VE  Code journal
    260608  Date de la pièce
     Ligne vide
     Ligne vide
    00012169 <-- Numéro de pièce (nouvelle pièce = tous les compteur à zéro)
     Ligne vide
    411  Compte
     Ligne vide
    17113C  je sais toujours pas lol
     Ligne vide
    Facture 00012169 LILI  Libelle
     Ligne vide
    150908  Date échéance
     Ligne vide
     Ligne vide
     Ligne vide
    0  Sens de la somme 0 = débit 1 = crédit
    11876.52  Montant
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
     Ligne vide
    #MECG
    // .. Etc
    Comme vous pouvez le voir il se repete
    #MECG, permet de savoir que l'on change de bloc de ligne (PS : à la fin du fichier j'ia un #FIN)
    Le numéro de pièce me permet de savoir que tout bloc de lignes vont ensembles, donc si je change de numéro de pièce je change de bloc de ligne.

    La problématique, je doit regrouper pour un même numéro de pièce les bloc de lignes qui on le même numéro de compte et le même sens pour n'en faire qu'un et additionner les Montants.

    Dans mon exemple il y a 2 blocs de lignes pour le compte 7042000 (en rouge dans l'exemple) qui ont le même numéro de pièce 00012081, le même sens 1.
    Je doit donc obtenir après traitement de mon exemple un seul bloc ligne.
    Biensur dans ce résultat il faut ajouter le premier bloc et les suivants puis tester tous les autres (le fichier TXT peux faire 7 Mo)


    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
     
    // Le haut ne change pas 
    #MECG 
    VE 
    270508
     
     
    00012081 
     
    7042000
     
     
     
    Facture 00012081 LILI 
     
     
     
     
     
    1
    28507,70 // <-- pour info (14895.93  + 13611.77)
     
     
     
     
     
     
     
     // <-- Ligne Vide

    Comme j'ai déjà fais un traitement sur ce fichier, que j'avais exposé au fofo, votre aide m'avait fais gagner du temps en traitement. Sur ce traitement là j'aimerais que vous m'aidiez dans la démarche, découper le fichier, regrouper, continuer le traiement... je vois pas du tout par où je peux commencer.

    Merci pour votre coup de main

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    bon j'ai réussi à faire quelquechose.
    Mais j'ia un problème siur le fichier de sortie .TXT

    voici ma procédure

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
      with TStringList.Create do
      Begin
        Try
          LoadFromFile(DossierDefaut+'\'+FichierAtraiter);
          i := 0;
          While (Strings[i] <> FinDeFichier) do
          Begin
            if (Strings[i] = RuptureLigne) then
            Begin
              With ADOTable2 Do
              Begin
                Open;
                Insert;
                FieldByName('Rupture').AsString := Strings[i];
                FieldByName('Journal').AsString := Strings[i+1];
                DatePiece := LeftStr(Strings[i+2],2) + '/'+ MidStr(Strings[i+2],3,2) + '/' + RightStr(Strings[i+2],2);
                if length(DatePiece) = 8 then FieldByName('DatePiece').AsDateTime := StrToDate(DatePiece);
                FieldByName('NumPiece').AsString := Strings[i+5];
                FieldByName('Compte').AsString := Strings[i+7];
                FieldByName('CodeTiers').AsString := Strings[i+9];
                FieldByName('LibellePiece').AsString := Strings[i+11];
                DateEcheance := LeftStr(Strings[i+13],2) + '/'+ MidStr(Strings[i+13],3,2) + '/' + RightStr(Strings[i+13],2);
                if length(DateEcheance) = 8 then FieldByName('DateEcheance').AsDateTime := StrToDate(DateEcheance);
                FieldByName('Sens').AsString := Strings[i+17];
                FieldByName('Montant').AsFloat := StrToFloat(StringReplace(Strings[i+18],'.',',',[]));
                Post;
              end;
                i := i + 26;
            end;
            inc(i);
          end;
          i := 0;
          With ADOQuery1 do
          Begin
            SQL.Clear;
            SQL.Add('Select Schema.Journal, Schema.NumPiece, Schema.Compte, Schema.Sens, Sum(Schema.Montant) AS SommeDeMontant, Schema.DatePiece, Schema.CodeTiers, Schema.DateEcheance, Schema.LibellePiece ');
            SQL.Add('FROM [Schema] ');
            SQL.Add('GROUP BY Schema.Journal, Schema.NumPiece, Schema.Compte, Schema.Sens, Schema.DatePiece, Schema.CodeTiers, Schema.DateEcheance, Schema.LibellePiece ');
            SQL.Add('Order By Schema.Journal, Schema.NumPiece ');
            Open;
            Strings[i] := '#FLG    ';
            inc(i);
            Strings[i] := '#VER 5';
            inc(i);
            Strings[i] := '#DEV EUR';
            inc(i);
            While not Eof do
            Begin
              Strings[i] := '#MECG';
              inc(i);
              Strings[i] := Fields.FieldByName('Journal').AsString;
              inc(i);
              Strings[i] := Fields.FieldByName('DatePiece').AsString;
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := Fields.FieldByName('NumPiece').AsString;
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := Fields.FieldByName('Compte').AsString;
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := Fields.FieldByName('CodeTiers').AsString;
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := Fields.FieldByName('LibellePiece').AsString;
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := Fields.FieldByName('DateEcheance').AsString;
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := Fields.FieldByName('Sens').AsString;
              inc(i);
              Strings[i] := Fields.FieldByName('SommeDeMontant').AsString;
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              Strings[i] := '';
              inc(i);
              next;
            end;
            Strings[i] := '#Fin';
            SaveToFile(DossierDefaut+'\'+FichierAtraiter);
          end;
        Finally
          Free;
          ADOTable2.Close;
          ADOQuery1.Close;
        End;
    end;

    FinFichier = '#FIN', RuptureLigne = '#MECG'


    Extrait de mon fichier de sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TG!     ¶’ò?²Ï# ª _þX        g Ò*cöëÏ°ã ª ?    	 	      *   Á<Ž¶ëmЍö ª _þX               
                             |  ¾"µÈó\Î*å ª Dw=     ÿÿ†    ÿÿ"        I        Á<Ž¶ëmЍö ª _þX                          2          (   " S c h e m a "  S c h e m a      ? ð   J o u r n a l    J o u r n a l ‚    ÿ   ÿ   j     ÿÿC ð   N u m P i e c e    N u m P i e c e ‚    ÿ   ÿ   j     ÿÿ; ð   C o m p t e    C o m p t e ‚ 	   ÿ   ÿ   j     ÿÿ3 ð   S e n s    S e n s ‚    ÿ   ÿ   j     ÿÿ9 €   S o m m e D e M o n t a n t        ÿ   z     ÿÿG ð  	 D a t e P i e c e   	 D a t e P i e c e     ÿ   ÿ   z     ÿÿG ð  	 C o d e T i e r s   	 C o d e T i e r s ‚    ÿ   ÿ   j     ÿÿS ð   D a t e E c h e a n c e    D a t e E c h e a n c e     ÿ   ÿ   z     ÿÿS ð 	  L i b e l l e P i e c e    L i b e l l e P i e c e ‚ P   ÿ   ÿ   j     ÿÿÿÿA C 0 0 0 1 1 1 1 8 4 0 1 1 )\Âõ8¢@     fã@
    1 7 0 1 0     €tã@FF a c t u r e   0 0 0 1 1 1 1 8   E l e c t r o - d i s t r i b u t i þÿA C 0 0 0 1 1 1 1 8 4 4 5 6 6 1 0 0 0 ®Gázäw@     fã@ FF a c t u r e   0 0 0 1 1 1 1 8   E l e c t r o - d i s t r i b u t i þÿA C 0 0 0 1 1 1 1 8 6 0 7 0 0 0 0 0 1 0 ÍÌÌÌÌxž@     fã@ FF a c t u r e   0 0 0 1 1 1 1 8   E l e c t r o - d i s t r i b u t i ÿÿA C 0 0 0 1 1 1 5 4 4 0 1 1 ìQ¸…kK@    €eã@
    1 5 8 7 0      pã@8F a c t u r e   0 0 0 1 1 1 5 4   R A D I O S P A R E S þÿA C 0 0 0 1 1 1 5 4 4 4 5 6 6 1 0 0 0       "@    €eã@ 8F a c t u r e   0 0 0 1 1 1 5 4   R A D I O S P A R E S þÿA C 0 0 0 1 1 1 5 4 6 0 1 1 0 0 0 0 ìQ¸…ëF@    €eã@ 8F a c t u r e   0 0 0 1 1 1 5 4   R A D I O S P A R E S ÿÿA C 0 0 0 1 1 1 5 6 4 0 1 1 ÍÌÌÌÌ|@    €eã@M I R K A N T A     €eã@2F a c t u r e   0 0 0 1 1 1 5 6   M I R K A N T A þÿA C 0 0 0 1 1 1 5 6 4 4 5 6 6 1 0 0 0 )\ÂõèP@    €eã@ 2F a c t u r e   0 0 0 1 1 1 5 6   M I R K A N T A þÿA C 0 0 0 1 1 1 5 6 6 0 1 1 0 0 0 0 Ãõ(\’u@    €eã@ 2F a c t u r e   0 0 0 1 1 1 5 6

    Hallucinant non ??? pourquoi j'ai cela ?

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Tu ne serais pas en Delphi 2009 par Hazard ?

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Troll

    non je suis en D7,
    Bon j'ai fais autrement et ca fonctionne

    Si vous avez une proposition d'accélération je suis preneur

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    procedure TFPrincipal.JvXPButton1Click(Sender: TObject);
    Var
      i: Integer;
      DatePiece, DateEcheance: String;
      FTxt: TextFile;
    begin
      with TStringList.Create do
      Begin
        Try
          LoadFromFile(DossierDefaut+'\'+FichierAtraiter);
          i := 0;
          While (Strings[i] <> FinDeFichier) do
          Begin
            if (Strings[i] = RuptureLigne) then
            Begin
              With ADOTable2 Do
              Begin
                Open;
                Insert;
                FieldByName('Rupture').AsString := Strings[i];
                FieldByName('Journal').AsString := Strings[i+1];
                DatePiece := LeftStr(Strings[i+2],2) + '/'+ MidStr(Strings[i+2],3,2) + '/' + RightStr(Strings[i+2],2);
                if length(DatePiece) = 8 then FieldByName('DatePiece').AsDateTime := StrToDate(DatePiece);
                FieldByName('NumPiece').AsString := Strings[i+5];
                FieldByName('Compte').AsString := Strings[i+7];
                FieldByName('CodeTiers').AsString := Strings[i+9];
                FieldByName('LibellePiece').AsString := Strings[i+11];
                DateEcheance := LeftStr(Strings[i+13],2) + '/'+ MidStr(Strings[i+13],3,2) + '/' + RightStr(Strings[i+13],2);
                if length(DateEcheance) = 8 then FieldByName('DateEcheance').AsDateTime := StrToDate(DateEcheance);
                FieldByName('Sens').AsString := Strings[i+17];
                FieldByName('Montant').AsFloat := StrToFloat(StringReplace(Strings[i+18],'.',',',[]));
                Post;
              end;
                i := i + 26;
            end;
            inc(i);
          end;
        Finally
          Free;
          ADOTable2.Close;
        end;
      end;
     
      AssignFile(FTxt,DossierDefaut+'\'+FichierAtraiter); //FichierAtraiter);
      ReWrite(FTxt);
      i := 0;
      With ADOQuery1 do
      Begin
        SQL.Clear;
        SQL.Add('Select Schema.Journal, Schema.NumPiece, Schema.Compte, Schema.Sens, Sum(Schema.Montant) AS SommeDeMontant, Schema.DatePiece, Schema.CodeTiers, Schema.DateEcheance, Schema.LibellePiece ');
        SQL.Add('FROM [Schema] ');
        SQL.Add('GROUP BY Schema.Journal, Schema.NumPiece, Schema.Compte, Schema.Sens, Schema.DatePiece, Schema.CodeTiers, Schema.DateEcheance, Schema.LibellePiece ');
        SQL.Add('Order By Schema.Journal, Schema.NumPiece ');
        Open;
        WriteLN(FTxt, '#FLG    ');
        WriteLN(FTxt, '#VER 5');
        WriteLN(FTxt, '#DEV EUR');
        While not Eof do
        Begin
          WriteLN(FTxt, '#MECG');
          WriteLN(FTxt, Fields.FieldByName('Journal').AsString);
          DatePiece := Leftstr(Fields.FieldByName('DatePiece').AsString,2)+ MidStr(Fields.FieldByName('DatePiece').AsString,4,2) + RightStr(Fields.FieldByName('DatePiece').AsString,2);
          if Length(DatePiece) = 6 Then
            WriteLN(FTxt, DatePiece)
          else
            WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, Fields.FieldByName('NumPiece').AsString);
          WriteLN(FTxt, '');
          WriteLN(FTxt, Fields.FieldByName('Compte').AsString);
          WriteLN(FTxt, '');
          WriteLN(FTxt, Fields.FieldByName('CodeTiers').AsString);
          WriteLN(FTxt, '');
          WriteLN(FTxt, Fields.FieldByName('LibellePiece').AsString);
          WriteLN(FTxt, '');
          if (Fields.FieldByName('Compte').AsString = RacineClient)
            or (Fields.FieldByName('Compte').AsString = RacineFrs) then
          Begin
            DateEcheance := Leftstr(Fields.FieldByName('DateEcheance').AsString,2)+ MidStr(Fields.FieldByName('DateEcheance').AsString,4,2) + RightStr(Fields.FieldByName('DateEcheance').AsString,2);
            if Length(DateEcheance) = 6 Then
              WriteLN(FTxt, DateEcheance)
            else
              WriteLN(FTxt, '');
          end
          else
            WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, Fields.FieldByName('Sens').AsString);
          WriteLN(FTxt, StringReplace(Fields.FieldByName('SommeDeMontant').AsString,',','.',[]));
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          WriteLN(FTxt, '');
          next;
        end;
        WriteLN(FTxt, '#Fin');
      end;
      ADOQuery1.Close;
      CloseFile(FTxt);
    end;
    Merci.

Discussions similaires

  1. traitement dans fichier txt
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/05/2009, 22h54
  2. Batch : Traitement sur fichier txt
    Par vita83 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 13/09/2008, 08h08
  3. PowerShell - Traitement de fichier.txt
    Par koKoTis dans le forum Windows
    Réponses: 3
    Dernier message: 23/07/2007, 18h25
  4. Traitement de fichier.txt
    Par koKoTis dans le forum Delphi
    Réponses: 3
    Dernier message: 05/07/2007, 14h35
  5. traitement de fichier TXT: mémoire insuffisante
    Par xherault dans le forum Delphi
    Réponses: 17
    Dernier message: 20/07/2006, 12h50

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