Bonjour à tous,

Je souhaiterais faire une application qui fait un certain traitement sur un fichier csv. si l'utilisateur coche la case à cocher "Trier", l'application fait que le tri de fichier, si il coche la case à cocher "Recadrer", il faut que le recadrage. Bien entendu s'il coche les deux, beh, il y aura les deux traitements Tri+recadrage.

Je souhaiterais calculer le pourcentage de traitement dans ces cas la, mais je n'arrive pas à savoir où et comment calculer le pourcentage.

code Recadrage:

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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
public void Processing()
        {
            string ligne;
            string targetFile;
            string targetFilelog;
            string[] TAB_ligne;
            string[] TAB_ligne_contrat;
            string[] TAB_ligne_personne;
            string[] TAB_contrat = new string[100];
            string[] TAB_personne = new string[100];
            string[] TAB_trou = new string[100];
            int cpt = 0; // compteur pour le remplissage de TAB_ligne_contrat
            int cpt2 = 0; // compteur pour le remplissage de TAB_ligne_personne
            int cpt_trou = 0; // compteur pour le remplissage de TAB_trou
            int cpt_garfictive = 0; //compteur afin de dénombrer le nombre de garantie fictive à ajouter sur 1 contrat
 
            LoadZone zone = new LoadZone();
 
            //Déclartion des variables qui serviront pour la comparaison dans le traitement
 
            // Variables Niveau contrat
            string NUMCCI = "";
            string DEBCTR = "";
            string FINCTR = "";
 
            // Variables Niveau personne
            string NUMRNG = "";
            string DEBPER = "";
            string FINPER = "";
 
            // Variables Niveau Produit (Garantie)
            string DEBGAR = "";
            string DEBGAR_precedent = "";
            string FINGAR_precedent = "";
 
            string GARFICTIVE = "";
 
 
            if (richTextBox1.Text != "")
            {
                //MessageBox.Show(varg.Filename);
                //ligne =
               // MessageBox.Show(varg.File);
 
               // FileSort(); // on appel la méthode FileSort afin de trier le fichier source
 
                //Libellé et chemin du fichier cible
                targetFile = varg.Filename + "_cible.csv";
 
                //Libellé et chemin du fichier de log
                targetFilelog = varg.Filename + ".log";
 
                //Lecture du fichier d'extraction en entrée,
                //2 lectures afin de réaliser la comparaison avec un décalage de 1 ligne
 
                StreamReader sr_File = new StreamReader(varg.Filename + "_trie.csv");
 
                //création du fichier cible
                StreamWriter sw_File = new StreamWriter(targetFile);
 
                //création du fichier de log
                StreamWriter sw_Filelog = new StreamWriter(targetFilelog);
                sw_Filelog.WriteLine("{0}", "Début du traitement"); //Ligne de début de traitement
 
                //Lecture du fichier
                ligne = sr_File.ReadLine(); //lecture de la 1ère ligne
 
                while (ligne != null)
                {
 
                    numLigne = numLigne + 1; // incrémentation du numéro de ligne lue
 
                    TAB_ligne = ligne.Split(';'); // on découpe la ligne dès qu'un ';' est rencontré, les éléments sont stockés dans un tableau de string
                    toTrim(TAB_ligne); // on supprime les espaces des zones afin de fiabiliser les comparaisons
 
                    //MessageBox.Show(TAB_ligne[zone.DIC_rang["NUMCCI"]]);
 
 
 
                    if (TAB_ligne[zone.DIC_rang["NUMCCI"]] == NUMCCI || NUMCCI == "") // Si on lit le même contrat ou si on est positionné à la 1ère ligne alors on stock la ligne dans le tableau de niveau contrat TAB_contrat
                    {
                        //MessageBox.Show(cpt.ToString() + " " + TAB_ligne[zone.DIC_rang["NUMCCI"]]);
                        //MessageBox.Show(ligne);
                        //on remplit le tableau temporaire avec la valeur de la ligne courante et ceci tant qu'un nouveau contrat n'est pas trouvé
                        TAB_contrat[cpt] = ligne;
                        NUMCCI = TAB_ligne[zone.DIC_rang["NUMCCI"]];
                        cpt = cpt + 1;
                        ligne = sr_File.ReadLine(); // on passe à la ligne suivante
 
                    }
 
                    if (TAB_ligne[zone.DIC_rang["NUMCCI"]] != NUMCCI || ligne == null) // si la ligne suivante n'est pas le même contrat ou si on a atteint la fin du fichier on début les traitements
                    {
                        //on effectue les traitements sur les lignes du contrat précédent, lignes stockées dans TAB_ligne_contrat
 
                        //on initialise à une valeur par défaut les variables que l'on va comparer
                        DEBCTR = "";
                        FINCTR = "";
                        DEBGAR = "";
 
                        // ####### DEBUT TRAITEMENT #######
 
                        // *** 1er passage de comparaison *** déterminer la date de la + ancienne garantie reprise sur le contrat
                        // Déterminer si on recadre au niveau CONTRAT
 
                        for (int i = 0; i < cpt; i++) // pn détermine quels sont les date de début contrat (DEBCTR) MIN, les dates de fin contrat (FINCTR) MAX et la date de début de la(les) plus ancienne(s) garantie(s) (DEBGAR) MIN
                        {
                            //MessageBox.Show(TAB_ligne[zone.DIC_rang["NUMCCI"]] + " " + TAB_contrat[i]);
                            TAB_ligne_contrat = TAB_contrat[i].Split(';'); // on découpe la ligne dès qu'un ';' est rencontré, les éléments sont stockés dans un tableau de string
                            toTrim(TAB_ligne_contrat); // on supprime les espaces des zones afin de fiabiliser les comparaisons
 
                            DEBCTR = minDate(DEBCTR, TAB_ligne_contrat[zone.DIC_rang["DEBCTR"]]);
                            FINCTR = maxDate(FINCTR, TAB_ligne_contrat[zone.DIC_rang["FINCTR"]]);
                            DEBGAR = minDate(DEBGAR, TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]]);
 
                            //MessageBox.Show(DEBCTR + " " + DEBGAR);
                        }
 
                        //on compare la date minimum debctr et debgar afin de déterminer si un passage de recadrage contrat est nécessaire
                        if (toDate(DEBCTR) == toDate(DEBGAR))
                        {
                            //SYS_log_line(sw_File_log_DEBCTR, SYS_format_log(NUMCCI + " PAS de recadrage de DEBCTR"));
                        }
                        else if (toDate(DEBCTR) < toDate(DEBGAR))
                        {
                            // on a désormais la date de début contrat recadrée, on l'affecte à DEBCTR
                            SYS_log_line(sw_File_log_DEBCTR, SYS_format_log(NUMCCI + " ancienne date " + DEBCTR + " nouvelle date " + DEBGAR));
                            DEBCTR = DEBGAR;
 
                            // *** passage de mise à jour ***
                            // on recadre au niveau CONTRAT
                            for (int i = 0; i < cpt; i++)
                            {
                                //MessageBox.Show(cpt + " " + i);
 
                                TAB_contrat[i] = UpdateLine(TAB_contrat[i], "DEBCTR", DEBGAR);
                                TAB_contrat[i] = UpdateLine(TAB_contrat[i], "FINCTR", FINCTR);
                            }
                        }
                        else
                            SYS_log_line(sw_File_log_DEBCTR, SYS_format_log(NUMCCI + " INCOHERENCE entre DEBCTR et DEBGAR "));
 
 
                        // *** 2e passage *** SI la date de debut de la personne est inférieure à celle de la date contrat recadrée on ajuste à la date de contrat recadrée
                        // on recadre au niveau PERSONNE
 
                        NUMRNG = "";
                        cpt2 = 0;
                        cpt_trou = 0;
                        DEBGAR = "";
                        FINPER = "";
                        DEBGAR_precedent = "";
                        FINGAR_precedent = "";
                        int numlignepers = 0;
                        for (int i = 0; i < cpt; i++)
                        {
                            TAB_ligne_contrat = TAB_contrat[i].Split(';'); // on découpe la ligne dès qu'un ';' est rencontré, les éléments sont stockés dans un tableau de string
                            toTrim(TAB_ligne_contrat); // on supprime les espaces des zones afin de fiabiliser les comparaisons 
 
                            //MessageBox.Show("NUMRNG " + NUMRNG + " TAB " + TAB_ligne_contrat[zone.DIC_rang["NUMRNG"]]);
                            if (NUMRNG == TAB_ligne_contrat[zone.DIC_rang["NUMRNG"]] || NUMRNG == "")
                            {
 
                                TAB_personne[cpt2] = TAB_contrat[i];
                                cpt2 = cpt2 + 1;
                                NUMRNG = TAB_ligne_contrat[zone.DIC_rang["NUMRNG"]];
                                DEBGAR = minDate(DEBGAR, TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]]); //on cherche la + ancienne garantie afin de déterminer le date de debut personne (debper)
                                FINPER = maxDate(FINPER, TAB_ligne_contrat[zone.DIC_rang["FINPER"]]); //on cherche date de fin personne (finper) la plus élévée
 
 
                                if (i == 0)
                                {
                                    DEBGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]];
                                    FINGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["FINGAR"]];
                                }
                                else
                                {   
                                    //Gestion des trous de couverture
                                    if((toDate(FINGAR_precedent) < toDate(TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]]).AddDays(-1) ) && (toDate(FINGAR_precedent) < toDate(TAB_ligne_contrat[zone.DIC_rang["FINGAR"]]).AddDays(-1)))
                                    {
                                        //MessageBox.Show(NUMCCI + " FINGAR_précedent " + FINGAR_precedent + " avec toDate " + toDate(FINGAR_precedent) + " DEBGAR - 1 " + toDate(TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]]).AddDays(-1));
                                        TAB_trou[cpt_trou] = UpdateLine(TAB_contrat[i], "CODPRD", SYS_format_zone("FICTIF", zone.DIC_long["CODPRD"])); // code FICTIF pour le code produit
                                        TAB_trou[cpt_trou] = UpdateLine(TAB_trou[cpt_trou], "CODGAR", SYS_format_zone("FICTIF", zone.DIC_long["CODGAR"])); // code FICTIF pour le code garantie
                                        TAB_trou[cpt_trou] = UpdateLine(TAB_trou[cpt_trou], "DEBGAR", SYS_format_zone(FINGAR_precedent, zone.DIC_long["DEBGAR"])); // la garantie commence au début du contrat recalculée
                                        TAB_trou[cpt_trou] = UpdateLine(TAB_trou[cpt_trou], "FINGAR", SYS_format_zone(TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]], zone.DIC_long["FINGAR"]));// Elle prend fin à l'ancienne date de début recalculée
 
                                        cpt_trou = cpt_trou + 1;
                                        DEBGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]];
                                        FINGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["FINGAR"]];
 
                                        SYS_log_line(sw_File_log_GARFIC, SYS_format_log(NUMCCI + " Garantie Fictive pour combler trou de couverture"));
                                    }
                                }
                                DEBGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]];
                                FINGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["FINGAR"]];
                            }
                            else if (NUMRNG != TAB_ligne_contrat[zone.DIC_rang["NUMRNG"]] || i == cpt - 1)
                            {
                                //recadrage de la date de debut (DEBPER) à la plus ancienne garantie, recadrage éventuel de FINPER à la fin de garantie la plus élevée
                                for (int i2 = 0; i2 < cpt2; i2++)
                                {
                                    TAB_ligne_personne = TAB_personne[i2].Split(';'); // on découpe la ligne dès qu'un ';' est rencontré, les éléments sont stockés dans un tableau de string
                                    toTrim(TAB_ligne_personne); // on supprime les espaces des zones afin de fiabiliser les comparaisons
 
                                    if (TAB_ligne_personne[zone.DIC_rang["DEBPER"]] != DEBGAR)
                                        SYS_log_line(sw_File_log_DEBPER, SYS_format_log(NUMCCI + " NUMRNG: " + NUMRNG + " ancienne DEBPER: " + TAB_ligne_personne[zone.DIC_rang["DEBPER"]] + " nouvelle DEBPER: " + DEBGAR));
                                    if (TAB_ligne_personne[zone.DIC_rang["FINPER"]] != FINPER)
                                        SYS_log_line(sw_File_log_FINPER, SYS_format_log(NUMCCI + " NUMRNG: " + NUMRNG + " ancienne FINPER: " + TAB_ligne_personne[zone.DIC_rang["FINPER"]] + " nouvelle FINPER: " + FINPER));
 
                                    TAB_personne[i2] = UpdateLine(TAB_personne[i2], "DEBPER", DEBGAR);
                                    TAB_personne[i2] = UpdateLine(TAB_personne[i2], "FINPER", FINPER);
                                }
                                for (int a = numlignepers; a < numlignepers + cpt2; a++)
                                {
                                    TAB_contrat[a] = TAB_personne[a - numlignepers];
                                }
 
                                numlignepers = numlignepers + cpt2;
 
                                Array.Clear(TAB_personne, 0, TAB_contrat.Length); // on vide le tableau
                                cpt2 = 0;
                                //cpt_trou = 0;
                                TAB_personne[cpt2] = TAB_contrat[i];
                                cpt2 = cpt2 + 1;
                                NUMRNG = TAB_ligne_contrat[zone.DIC_rang["NUMRNG"]];
                                DEBGAR = "";
                                FINPER = "";
 
                                DEBGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]];
                                FINGAR_precedent = TAB_ligne_contrat[zone.DIC_rang["FINGAR"]];
                            }
 
                        }
 
                        // *** 3e passage *** Gestion de l'assuré principal:
                        // on recadre la date de début de l'assuré principal sur la date de contrat recalculée
                        DEBGAR = "";
                        DEBPER = "";
                        GARFICTIVE = "";
 
                        for (int i = 0; i < cpt; i++)
                        {
                            TAB_ligne_contrat = TAB_contrat[i].Split(';'); // on découpe la ligne dès qu'un ';' est rencontré, les éléments sont stockés dans un tableau de string
                            toTrim(TAB_ligne_contrat); // on supprime les espaces des zones afin de fiabiliser les comparaisons
 
 
 
                            if (TAB_ligne_contrat[zone.DIC_rang["TYPASS"]] == "ASSPRI") // SI la ligne concerne l'assuré principal (le détenteur du contrat) on recadre automatiquement à la date de début contrat recalculée si nécessaire
                            {
                                DEBPER = minDate(DEBGAR, TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]]);
                                if (toDate(TAB_ligne_contrat[zone.DIC_rang["DEBPER"]]) > toDate(DEBCTR))
                                {
                                    TAB_contrat[i] = UpdateLine(TAB_contrat[i], "DEBPER", DEBCTR);
                                    GARFICTIVE = TAB_contrat[i];
 
                                    SYS_log_line(sw_File_log_GARFIC, SYS_format_log(NUMCCI + " DEBPER recalculée à la date de début contrat DEBCTR pour assuré principal afin de combler toute la période de validité du contrat"));
                                }
 
                                DEBGAR = TAB_ligne_contrat[zone.DIC_rang["DEBGAR"]];
                            }
                        }
 
                        //création de la garantie fictive
                        if (toDate(DEBPER) > toDate(DEBCTR) && GARFICTIVE != "") //Si DEBPER, calculée à la date min de la plus ancienne garantie (DEBGAR) est supérieure à la date de début contrat et qu'une garantie fictive est positionnée avec GARFICTIVE alors on insère une ligne
                        {
                            //MessageBox.Show("Garantie fictive pour assuré principal");
                            //MessageBox.Show("debper " + toDate(DEBPER) + " debctr " + toDate(DEBCTR));
                            cpt_garfictive = cpt_garfictive + 1;
 
                            TAB_trou[cpt_trou] = UpdateLine(GARFICTIVE, "CODPRD", SYS_format_zone("FICTIF", zone.DIC_long["CODPRD"])); // code FICTIF pour le code produit
                            TAB_trou[cpt_trou] = UpdateLine(TAB_trou[cpt_trou], "CODGAR", SYS_format_zone("FICTIF", zone.DIC_long["CODGAR"])); // code FICTIF pour le code garantie
                            TAB_trou[cpt_trou] = UpdateLine(TAB_trou[cpt_trou], "DEBGAR", SYS_format_zone(DEBCTR, zone.DIC_long["DEBGAR"])); // la garantie commence au début du contrat recalculée
                            TAB_trou[cpt_trou] = UpdateLine(TAB_trou[cpt_trou], "FINGAR", SYS_format_zone(DEBPER, zone.DIC_long["FINGAR"]));// Elle prend fin à l'ancienne date de début recalculée
                            cpt_trou = cpt_trou + 1;
 
                            SYS_log_line(sw_File_log_ASSPRI, SYS_format_log(NUMCCI + " Garantie Fictive assuré principal afin de combler toute la période de validité du contrat"));
                        }
 
                        // *** dernier passage ***
                        // on écrit les lignes dans le fichier en sortie
 
                        for (int i = 0; i < cpt; i++)
                        {
                            sw_File.WriteLine("{0}", TAB_contrat[i]);//écriture de la ligne courante dans le fichier cible
                        }
 
                        for (int i = 0; i < cpt_trou; i++)
                        {
                            //MessageBox.Show(TAB_trou[i]);
                            sw_File.WriteLine("{0}", TAB_trou[i]);//écriture de la ligne courante dans le fichier cible
                        }
 
                        //on positionne NUMCCI à la valeur du nouveau contrat trouvé
                        NUMCCI = TAB_ligne[zone.DIC_rang["NUMCCI"]];
                        //on vide les tableaux
                        Array.Clear(TAB_contrat, 0, TAB_contrat.Length);
                        Array.Clear(TAB_trou, 0, TAB_trou.Length);
 
                        cpt = 0;
 
                    }
code tri:

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
public void FileSort()
{
    LoadZone zone = new LoadZone();
 
    string ligne;
    string[] TAB_ligne;
    List<Contrat> listeContrats = new List<Contrat>();
 
    //construction d'un tableau avec les NUMCIN, NUMRNG, DEBGAR, FINGAR et la valeur de la ligne entière de l'extraction PréDMA
 
    using (StreamReader reader = new StreamReader(varg.Filename))
    {
        while ((ligne = reader.ReadLine()) != null)
        {
            TAB_ligne = ligne.Split(';');
            //MessageBox.Show(tabLigne[0].Trim() + " " + tabLigne[1].Trim());
            listeContrats.Add(new Contrat
            {
                NUMCCI = TAB_ligne[zone.DIC_rang["NUMCCI"]],
                DEBCTR = TAB_ligne[zone.DIC_rang["DEBCTR"]],
                FINCTR = TAB_ligne[zone.DIC_rang["FINCTR"]],
                NUMRNG = Convert.ToInt32(TAB_ligne[zone.DIC_rang["NUMRNG"]]),
                CODPRD = TAB_ligne[zone.DIC_rang["CODPRD"]],
                CODGAR = TAB_ligne[zone.DIC_rang["CODGAR"]],
                DEBGAR = TAB_ligne[zone.DIC_rang["DEBGAR"]],
                FINGAR = TAB_ligne[zone.DIC_rang["FINGAR"]],
                lig = ligne
            });
 
        }
 
    }
 
    IEnumerable<string> requete = from c in listeContrats
                                  orderby c.NUMCCI, c.NUMRNG,
                                  c.DEBGAR, c.FINGAR
                                  select c.lig;
 
 
    //Ecriture des données dans le fichier de déstination
    using (StreamWriter writer = new StreamWriter(varg.Filename + "_trie.csv"))
    {
        foreach (string lig in requete)
        {
            writer.WriteLine(lig);
        }
    }
    MessageBox.Show("Fichier trié avec succès. ");
 
}


En sachant qu'il y a beaucoup de test, et que tout le traitement se fait dans la boucle while. il y a un traitement ligne par ligne.

J'ai fait une fonction qui me donne le nombre de lignes du fichier à traiter.

Il faut rappeler que si l'utilisateur coche que le tri, le pourcentage n'est pas le même. la même chose s'il fait les deux ou juste le recadrage.

Je souhaiterais utiliser ce pourcentage dans l'affichage d'une barre de progression.


Comment faire? quelqu'un a-t-il une idée?

Je vous remercie par avance.

Bien cordialement.