Pourquoi ?il ne veut pas entendre de dataset ou de table temporaire, tout doit ce faire par lecture de fichier et pointeurs
Les objets sont autorisés au moins ?![]()
Pourquoi ?il ne veut pas entendre de dataset ou de table temporaire, tout doit ce faire par lecture de fichier et pointeurs
Les objets sont autorisés au moins ?![]()
Pas nécessairement. Je connais beaucoup de gens chez qui c'est simplement leur façon d'être et de travailler.
Sinon pour en revenir au sujet.
Et du point de vu des performances, il a certainement raison ! L'initialisation de ton DataSet, ou ta table temporaire prendra a elle seule autant de temps que le traitement complet... (en tout cas, que ce qu'il est possible de faire).s'est exactement ce que je veux faire mais mon boss veux tout en même temps
Désolé mais j'ai beau lire et relire la discussion, je ne comprend toujours pas ce que tu cherches à faire.
Donc je résume ce que j'ai compris :
- Tu as un fichier CSV, de 300 Mo.
- Ce dernier se compose de lignes avec 9 champs.
- Le fichier n'est pas trié et peut contenir des doublons (quels sont les champs qui forment la clé pour dire qu'il y a doublons ? (1 et 2 ?)).
- Tu veux supprimer les doublons et insérer les nouvelles valeurs dans une base ? (c'est la que je ne comprends pas ce que tu cherches à faire...)
Du peu que je comprends, le problème se décompose en trois étapes qui peuvent s'optimiser indépendemment les unes des autres :
- Lecture du fichier CSV et analyse du contenu (découpage en lignes et en champs).
- Test d'existance des valeurs (les recherches dans les TList ou TStringList).
- Insertion des enregistrements en base.
Il serait bon que tu commences par mesurer les temps de traitement de chaqu'une de ces étapes pour évaluer les gains possibles à chaque niveau.
Bonjour,
... tu peux dire au boss que dans toutes les professions un bon ouvrier choisit toujours l'outil le mieux adapté au résultat visé et qui dit le mieux adapté suppose un examen d'adaptation, et dans le cas présent une étude préalable de faisabilté et de comparaison des avantages et des inconvénients de chaque outil.il ne veut pas entendre de dataset ou de table temporaire, tout doit ce faire par lecture de fichier et pointeurs
(Et même si les exigences du boss étaient celles du client rien n'interdirait de discuter)
Si t'as 1GO de RAM tu dois pouvoir charger au moins deux fois ton fichier de 300 Mo entièrement dans la RAM ce qui permet :
1 - de charger ce fichier dans un 1er MemoryStream (vitesse optimale garantie) à partir d'un TFileStream (comme tes lignes de données sont séparées par des ";" et comportent toujours neuf données : toto;20071001;20071006;93;9;00:00:00;23:59:59;0.16590000;AFGHANISTAN;tu connais donc toujours la position de chaque donnée dans le FileStream sans avoir à le découper puisqu'il l'est déjà. La fin de ligne est repérable avec nombre de ";" modulo 9 = 0),
2 - de le classer en ordre vers un 2ième MemoryStream et de le librérer le 1er, (pour regrouper les doublons s'il faut les supprimer)
3 - de supprimer les doublons dans ce 2ième MemoryStream non par supression mais en les ignorant lors d'une simple copie de ce 2ième MemoryStream dans un 3ème MemoryStream (le 1er ayant été libéré de la RAM)
3 - et ensuite tu passes à ton truc d'occurences dont l'énoncé gagne à être clarifé : Si par exemple "toto" est présent dans une seule ligne tu sauvegardes quoi et tu ignores quoi ? Autement dit quels sont les critères du tri. Et si "toto" est présent dans plusieurs lignes (donc 2 ocurrences du même mot ou même data) t'en fais quoi ?
A+![]()
Je vous remercie tous pour vos message et vos conseils.
En fait j'ai essayer de faire tout ce que vous avez dit sauf le memorystream, je le confesse je ne le connais pas, mais je vais essayé.
je me donne a font dans tous ce que je fait, le problème c'est qu'il ne me laisse pas le temps de me poser et de voir toutes les solutions possible et d'en tirer alors les conséquences.
1- j'ai essayé de chargé dans un Tfilestring pour recherche dans le trop long (traitement) et prend beaucoup de RAM et le boss ne veux pas
2- J'ai essayé le Tlist avec Objet prend un peut de place et long (traitement) et le boss ne veut pas
3- J'ai essayé le DataSet prend un peut de place et long (traitement) et le boss ne veut pas
3-1-Charger tous le fichier dans un clientDataset et effectuer le travail dessus long (traitement) et le boss ne veut pas
3-2- Charger dans plusieurs dataset et faire le travail long (traitement)et le boss ne veut pas
4- j'ai essayer comme il veut long et il n'est jamais comptent
Le gros problème c'est que je n'ai même pas le temps de me retourné pour voir si ce que je fait est viable, toutes les 5 minutes il vient me gonfler alors s'en ou, alors s'en est ou .......moi je pète un câble.
je vais le laissé lui et ses programmes et il aura bien du mal à trouvé quelqu'un
je pense et pardonnez moi cette prétention, mais je suis sure que s'il m'avait donner deux mois libre et un cahier des charges clair et une petite formation sur les data de télécommunication, alors je lui aurais fait quelque chose de bien.
Je pense aussi être trop en colère contre lui pour être objectif mais je sais une chose :
Je ne veux plus bosser avec lui
Qays
Est ce que ce raisonnement est correct d'après ce que dit l'énnoncé:
Pour chaque ligne
Recherche si Occurence(1) existe, placer dans un TLIST1 sinon placer dans Data
Recherche si Occurence(2) existe, placer dans un TLIST2 sinon placer dans Data
Recherche si Occurence(3) existe, placer dans un TLIST3 sinon placer dans Data
Recherche si Occurence(4) existe, placer dans un TLIST4 sinon placer dans Data
Recherche si Occurence(5) existe, placer dans un TLIST5 sinon placer dans Data
Recherche si Occurence(6) existe, placer dans un TLIST6 sinon placer dans Data
Recherche si Occurence(7) existe, placer dans un TLIST7 sinon placer dans Data
Fin pour
In fine, je ne serais pas tenté d'utiliser le TClientDataset.
S'il te donne des instructions, demande à avoir des explications.
Il doit argumenter ses propros, à ton tour de le tester.
merci chaplin de me conforter dans mon choix, sa réponse
s'est mieux et on doit faire au plus vite![]()
J'arrive un peu tard dans la discussion, mais c'est vrai que la demande de ton boss est assez bizzarre et speciale...
M'enfin bon, j'ai deja eu a traiter ce genre de probleme, j'ai utilisé des TStringList par manque de connaissance à l'époque mais ça va, ça marché correctement. Un peu long...
Et en faite, j'avais fais une espece de bidouille qui était bien utile.
J'ai vu que tes champs sont séparé par ;
Si ton occurence est un debut de ville par exemple, tu peux changer les colonnes de place en mettant la colonne (ville dans notre exemple) où tu souhaites chercher ton occurence en position 0 (maStringList.exchange(index1,index2)) puis faire un trie, puis rechercher ton occurence.
Clairement, j'avais fais un truc genre :
MaList.loadFromFile(monfichier);
maList.sorted:=true;
malist.exchange(index1,index2);
rechercheOccurence(list,occ);
remiseEnPlaceDesDonness(list);
maListe.saveToFile(monFichier);
L'avantage :
- C'est que le trie des listes est ultra rapide
- La recherche d'occurence se fait plus facilement vu que c'est trié (par dichotomie c'est le must dans ce cas la).
L'inconvenient :
- Aucun, c'est parfait!je plaisante... l'inconveniant, c'est que le traitement peut etre un peu long et que si pour X ou Y raison, ça plante. Faut tout recommencer.
J'ai vu que l'on a utilisé la TStringList (avec Sorted à False ? et à True ?), la TList, mais as-tu tenté la THashedStringList (IniFiles) ??? qui pour des chaines longues permet de réduire les temps de recherches en regroupant les chaines par une clé de hash ... elle est chiante a manipuler mais le principe peut-être réutilisé !
Autre Question, est-ce un fichier CSV géré vraiement comme un CSV ou plutôt comme un fichier à position fixe :
CSV :
Fixe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 abc;adefded;bded;1; abcded;deded;beddb;47; fgfg;bede;abc;29;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 abc;adefded; bded;001; abcded; deded;beddb;047; fgfg; bede; abc;029; ; ; ; ;
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Cela revient à faire une analyse lexical, qu'est ce qu'on utilise pour ce genre de traitement en général ?
ava ? init ?
Un dérivé de java mais avec du code deja tout pret.
salut, si au moins tu as pris le temps de répondre au question de Franck SORIANO et Gilbert Geyer, sera mieux, car là tu as besoin des programmeurs agées qui ont à l'époque travail bien avec les fichiers sans utilisé des objet (TList,...) (age>30 ans) pour t'aidé contre ton bos![]()
Sinon, rien que parcourir une TStringList de 3M de Lignes, cela prend plusieurs secondes*, la remplir 25 avec mon test, alors que lire le fichier n'en prend que 12 (avec création d'un autre fichier d'index OffSet-Length via TTextFileReader)
*Donc, automatiquement à un moment donné, ça traine, j'ai fait le même principe que toi, le fichier faisait 100Mo, environ 10Mo était récupéré, chaque ligne était associé à une table de code (environ 100000 codes), je parsais le texte (libéllé, notes, ...), cela générait un glossaire (environ 12000 mots), et un Index de 850 000 lien mot-code, c'était généré en 1 minutes environ par ce que le glossaire finalement ne grossissait que très peu (les mots comme a donc si le ... était évidemment exclu, environ 400 mots blacklistés !), ensuite, la DB était tellement lente (la gestion des compteurs à la main sans trigger, insertion une par une, ...) ça prenait 1h, alors, je n'ai jamais cherché à améliorer la TStringList du Glossaire ... si j'avais eu 7 liste, cela aurait duré au moins 10 minutes ...
Un autre Test, import d'un fichier CSV avec MySQL, il a avale les 300Mo en une bonne dizaines de minutes, puis pour créer un index sur chaque colonne, cela prend entre 5 et 10 minutes par index, on atteind rapidement 1 heure ! Je pense que les experts en indexation de MySQL sont bien meilleur que nous, disons que 2h pour tout traiter ça serait pas mal !
Test sur un P4 3Ghz 4Go Ram
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
resalut voila les trois codes possible ::
1 code avec des records des pointeurs et des tlist
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 procedure TFrame3.TraitementGeneralGrilleRecord(Sender: TObject); var i:integer; j:integer; K:Integer; TgidInterne:PClassGrille; destinationidInterne:PClassDest; opeidinterne:Integer; //****************************** ClassDest:PClassDest; ClassGrille:PClassGrille; ClassPrefixe:PClassPrefixe; ClassFormule:PClassFormule; ClassOperateur: PClassOperateur; //****************************** QaysLogTrace:TQaysLogTrace; cur_ope:String; cur_date:String; cur_dest:String; cur_formule:String; tmp_formule:String; nb_dest : integer; nb_pref : integer; nb_fvente: integer; dispose_ok: boolean; begin cur_ope := ''; cur_date := ''; cur_dest := ''; cur_formule := ''; nb_dest := 0; nb_pref := 0; nb_fvente := 0; with MigrationFormule do begin //************************************************* //Lecture du max de chaque table pour le numéroteur //************************************************* FmaxDest:=lDestination.QaysUtilBdd.GetNextNumFromTable('destination','destination_id'); FmaxFormule:=lTarifFormule.QaysUtilBdd.GetNextNumFromTable('tarif_formule','tf_id'); FmaxGrille:=lTarifGrille.QaysUtilBdd.GetNextNumFromTable('tarif_grille','tg_id'); FmaxOperateur:=lTarifFormule.QaysUtilBdd.GetNextNumFromTable('operateur','ope_id'); //****************************************************************************** if MigrationFormule.QLFICHIER.ReadFichier = 0 then begin //ProgressBar1.Min := 0; //ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize; GaugeCtrlFic.MinValue:= 0; GaugeCtrlFic.MaxValue:= MigrationFormule.QLFICHIER.GetSize; i:= 0; Repeat Try //****************************************************************************** i:= i+1; MigrationFormule.QLFICHIER.ReadLigne; GaugeCtrlFic.Progress := i; if (i mod 1000)= 0 then begin //LabelTimeToExport.Caption := IntToStr(i); Application.ProcessMessages; end; TempWork.LigneProgress:=MigrationFormule.QLFICHIER.Ligne; if (copy(TempWork.GiveOccurence(3), 1, 6) = '200808') or (copy(TempWork.GiveOccurence(4), 1, 6) = '200808') or (copy(TempWork.GiveOccurence(4), 1, 6) = '200809') or (copy(TempWork.GiveOccurence(4), 1, 6) = '200809') then begin if TempWork.GiveOccurence(5) <> '' then begin //****************************************************************************** if cur_ope <> TempWork.GiveOccurence(1) then begin cur_ope := TempWork.GiveOccurence(1); cur_date := ''; ClientDataSetOperateur.Filter := 'ope_nom_court='+''''+LowerCase(TempWork.GiveOccurence(1))+'''' + ' or ope_nom_court='+''''+UpperCase(TempWork.GiveOccurence(1))+''''; ClientDataSetOperateur.Filtered:= true; ClientDataSetOperateur.Open; if ClientDataSetOperateur.RecordCount = 0 then begin k:=MigrationFormule.SearchInOperateur([TempWork.GiveOccurence(1)]); if k = -1 then begin new(ClassOperateur); FmaxOperateur:= FmaxOperateur+1; ClassOperateur.ope_id := FmaxOperateur; ClassOperateur.ope_nom_long := TempWork.GiveOccurence(1); ClassOperateur.ope_nom_court := TempWork.GiveOccurence(1); lOperateurInMem.Add(ClassOperateur); k:= MigrationFormule.SearchInOperateur([ClassOperateur.ope_nom_court]); end; opeidinterne :=TClassOperateur(lOperateurInMem.Items[K]^).ope_id; end else opeidinterne := ClientDataSetOperateur.FieldByName('ope_id').Value; Labeloperateur.Caption := 'Nb d''Operateurs. '+IntTostr(lOperateurInMem.Count-1); end; //****************************************************************************** if cur_date <> TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4) then begin k:=MigrationFormule.SearchInGrilleDate([TempWork.GiveOccurence(3),TempWork.GiveOccurence(4)]); if k = -1 then begin cur_date := TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4); cur_dest := ''; new(ClassGrille); FmaxGrille:= FmaxGrille+1; ClassGrille.idgrille := FmaxGrille; ClassGrille.opeid := opeidinterne; ClassGrille.dateDeb := TempWork.GiveOccurence(3); ClassGrille.dateFin := TempWork.GiveOccurence(4); ClassGrille.destination := TList.Create; lGrilleInMem.Add(ClassGrille); k:=MigrationFormule.SearchInGrilleDate([ClassGrille.dateDeb,ClassGrille.datefin]); end; TgidInterne :=lGrilleInMem.Items[K]; LabelGrille.Caption := 'Nb de Dates. '+IntTostr(lGrilleInMem.Count-1); end; //****************************************************************************** k := MigrationFormule.SearchInGrilleDest(TClassGrille(TgidInterne^).destination, [TempWork.GiveOccurence(10)]); if k = -1 then begin FmaxDest := FmaxDest+1; New(ClassDest); ClassDest.Destination := TempWork.GiveOccurence(10); ClassDest.iddes := FmaxDest; ClassDest.prefixe := TList.create; ClassDest.fvente := TList.create; TClassGrille(TgidInterne^).destination.Add(ClassDest); k:= MigrationFormule.SearchInGrilleDest(TClassGrille(TgidInterne^).destination, [ClassDest.Destination]); inc(nb_dest); end; destinationidInterne := TClassGrille(TgidInterne^).destination.Items[K]; LabelDest.Caption := 'Nb de destinations. '+IntTostr(nb_dest); //****************************************************************************** if MigrationFormule.SearchInGrillePref(TClassDest(destinationidInterne^).prefixe, [TempWork.GiveOccurence(5)]) = -1 then begin New(ClassPrefixe); ClassPrefixe.prefix := TempWork.GiveOccurence(5); TClassDest(destinationidInterne^).prefixe.add(ClassPrefixe); inc(nb_pref); LabelPrefix.Caption := 'Nb de préfixes. '+IntTostr(nb_pref)+' -> '+ inttostr(TClassDest(destinationidInterne^).prefixe.count); end; //****************************************************************************** dispose_ok:=true; New(ClassFormule); ClassFormule.idjour := MY_LIB_DIVERS.StrToInt(TempWork.GiveOccurence(6)); ClassFormule.TF_DATE_DEBUT :=TempWork.GiveOccurence(3); ClassFormule.TF_DATE_FIN := TempWork.GiveOccurence(4); ClassFormule.TF_HEURE_DEBUT :=TempWork.GiveOccurence(7); ClassFormule.TF_HEURE_FIN :=TempWork.GiveOccurence(8); ClassFormule.TF_CNX_DUREE :='0'; ClassFormule.TF_CNX_COUT :='0'; ClassFormule.TF_PRIX :=TempWork.GiveOccurence(9); ClassFormule.TF_PAS :='0'; if MigrationFormule.SearchInGrilleFormule(TClassDest(destinationidInterne^).fvente, [ClassFormule.idjour, ClassFormule.TF_DATE_DEBUT, ClassFormule.TF_DATE_FIN, ClassFormule.TF_HEURE_DEBUT, ClassFormule.TF_HEURE_FIN, ClassFormule.TF_PRIX]) = -1 then begin FmaxFormule:= FmaxFormule+1; ClassFormule.idformule := FmaxFormule; TClassDest(destinationidInterne^).fvente.Add(ClassFormule); dispose_ok:=false; inc(nb_fvente); LabelFormule.Caption := 'Nb de formules. '+inttostr(nb_fvente); end; if dispose_ok then dispose(ClassFormule); end; end; //****************************************************************************** Except on E: Exception do begin QaysLogTrace:=TQaysLogTrace.Create; QaysLogTrace.NomAppelant:='TraitementGeneralGrilleRecord'; QaysLogTrace.LogDateTime:=(now); QaysLogTrace.Parametre.Add('Erreur :'+E.Message); QaysLogTrace.Parametre.Add(TempWork.LigneProgress); QaysLogTrace.WriteLogTrace; end; End; Until (MigrationFormule.QLFICHIER.FinFichier); MigrationFormule.QLFICHIER.CloseFichier; end; end; //********************************************************* end;
1 code avec un dataset qui charge tout le ficheir et ensuite je fait un traitement comme avec une table select, insert, delete etc....
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 //***************************************************************************** procedure TFrame3.CharegInDataSet(Sender: TObject); var QaysLogTrace:TQaysLogTrace; i:integer; begin ClientDataSetimport :=TClientDataSet.Create(nil); ClientDataSetimport.FieldDefs.Add('operateur',ftString,30,false); ClientDataSetimport.FieldDefs.Add('operateurcode',ftString,30,false); ClientDataSetimport.FieldDefs.Add('date-debut',ftString,30,false); ClientDataSetimport.FieldDefs.Add('date-fin',ftString,30,false); ClientDataSetimport.FieldDefs.Add('prefix',ftString,30,false); ClientDataSetimport.FieldDefs.Add('tarif-jour',ftString,30,false); ClientDataSetimport.FieldDefs.Add('heure-debut',ftString,30,false); ClientDataSetimport.FieldDefs.Add('heure-fin',ftString,30,false); ClientDataSetimport.FieldDefs.Add('prix',ftString,30,false); ClientDataSetimport.FieldDefs.Add('destination fichiers',ftString,30,false); ClientDataSetimport.CreateDataSet; with MigrationFormule do begin //************************************************* //Lecture du max de chaque table pour le numéroteur //************************************************* //****************************************************************************** if MigrationFormule.QLFICHIER.ReadFichier = 0 then begin ProgressBar1.Min := 0; ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize; GaugeCtrlFic.MinValue:= 0; GaugeCtrlFic.MaxValue:= ProgressBar1.Max; i:= 0; Repeat Try i:= i+1; MigrationFormule.QLFICHIER.ReadLigne; GaugeCtrlFic.Progress := i; ProgressBar1.Position := i; if (i mod 1000)= 0 then begin LabelTimeToExport.Caption := IntToStr(i); Application.ProcessMessages; end; TempWork.LigneProgress:=MigrationFormule.QLFICHIER.Ligne; ClientDataSetimport.Append; ClientDataSetimport.FieldByName('operateur').value:=TempWork.GiveOccurence(1); ClientDataSetimport.FieldByName('operateurcode').value:=TempWork.GiveOccurence(2); ClientDataSetimport.FieldByName('date-debut').value:=TempWork.GiveOccurence(3); ClientDataSetimport.FieldByName('date-fin').value:=TempWork.GiveOccurence(4); ClientDataSetimport.FieldByName('prefix').value:=TempWork.GiveOccurence(5); ClientDataSetimport.FieldByName('tarif-jour').value:=TempWork.GiveOccurence(6); ClientDataSetimport.FieldByName('heure-debut').value:=TempWork.GiveOccurence(7); ClientDataSetimport.FieldByName('heure-fin').value:=TempWork.GiveOccurence(8); ClientDataSetimport.FieldByName('prix').value:=TempWork.GiveOccurence(9); ClientDataSetimport.FieldByName('destination fichiers').value:=TempWork.GiveOccurence(10); ClientDataSetimport.Post; Except on E: Exception do begin QaysLogTrace:=TQaysLogTrace.Create; QaysLogTrace.NomAppelant:='TraitementGeneralGrilleRecord'; QaysLogTrace.LogDateTime:=(now); QaysLogTrace.Parametre.Add('Erreur :'+E.Message); QaysLogTrace.Parametre.Add(TempWork.LigneProgress); QaysLogTrace.WriteLogTrace; end; End; Until (MigrationFormule.QLFICHIER.FinFichier); MigrationFormule.QLFICHIER.CloseFichier; end; end; //********************************************************* end;
et enfin un qui est l'équivalent du premier sauf que là les clientdataset remplace les pointeur et tlist
//******************************************************************************
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 procedure TFrame3.TraitementGeneralGrilleClientDataSet(Sender: TObject); var i:integer; j:integer; K:Integer; TgidInterne:Integer; destinationidInterne:Integer; opeidinterne:Integer; //****************************** ClassDest:TClientDataSet; ClassGrille:TClientDataSet; ClassPrefixe:TClientDataSet; ClassFormule:TClientDataSet; ClassOperateur: TClientDataSet; ClassImportFile: TClientDataSet; //****************************** cur_ope:String; cur_date:String; cur_dest:String; cur_formule:String; tmp_formule:String; datedebut:Tdate; begin datedebut:= now; cur_ope := ''; cur_date := ''; cur_dest := ''; cur_formule := ''; ClassImportFile := TClientDataSet.Create(nil); ClassImportFile.FieldDefs.Add('operateur',ftString,30,false); ClassImportFile.FieldDefs.Add('date-debut',ftString,30,false); ClassImportFile.FieldDefs.Add('date-fin',ftString,30,false); ClassImportFile.FieldDefs.Add('prefix',ftString,30,false); ClassImportFile.FieldDefs.Add('tarif-jour',ftString,30,false); ClassImportFile.FieldDefs.Add('heure-debut',ftString,30,false); ClassImportFile.FieldDefs.Add('heure-fin',ftString,30,false); ClassImportFile.FieldDefs.Add('prix',ftString,30,false); ClassImportFile.FieldDefs.Add('destination fichiers',ftString,30,false); ClassImportFile.CreateDataSet; ClassOperateur := TClientDataSet.Create(nil); ClassOperateur.FieldDefs.Add('ope_id',ftString,30,false); ClassOperateur.FieldDefs.Add('ope_nom_court',ftString,30,false); ClassOperateur.FieldDefs.Add('ope_nom_long',ftString,30,false); ClassOperateur.CreateDataSet; ClassGrille := TClientDataSet.Create(nil); ClassGrille.FieldDefs.Add('id_grille',ftString,30,false); ClassGrille.FieldDefs.Add('dateDeb',ftString,30,false); ClassGrille.FieldDefs.Add('datefin',ftString,30,false); ClassGrille.CreateDataSet; ClassDest := TClientDataSet.Create(nil); ClassDest.FieldDefs.Add('id_des',ftString,30,false); ClassDest.FieldDefs.Add('id_grille',ftString,30,false); ClassDest.FieldDefs.Add('destination',ftString,30,false); ClassDest.CreateDataSet; ClassPrefixe := TClientDataSet.Create(nil); ClassPrefixe.FieldDefs.Add('prefixe',ftString,30,false); ClassPrefixe.FieldDefs.Add('id_Grille',ftString,30,false); ClassPrefixe.FieldDefs.Add('id_des',ftString,30,false); ClassPrefixe.CreateDataSet; ClassFormule := TClientDataSet.Create(nil); ClassFormule.FieldDefs.Add('id_Grille',ftString,30,false); ClassFormule.FieldDefs.Add('id_des',ftString,30,false); ClassFormule.FieldDefs.Add('idjour',ftString,30,false); ClassFormule.FieldDefs.Add('TF_DATE_DEBUT',ftString,30,false); ClassFormule.FieldDefs.Add('TF_DATE_FIN',ftString,30,false); ClassFormule.FieldDefs.Add('TF_HEURE_DEBUT',ftString,30,false); ClassFormule.FieldDefs.Add('TF_HEURE_FIN',ftString,30,false); ClassFormule.FieldDefs.Add('TF_CNX_DUREE',ftString,30,false); ClassFormule.FieldDefs.Add('TF_CNX_COUT',ftString,30,false); ClassFormule.FieldDefs.Add('TF_PRIX',ftString,30,false); ClassFormule.FieldDefs.Add('TF_PAS',ftString,30,false); ClassFormule.FieldDefs.Add('id_formule',ftString,30,false); ClassFormule.CreateDataSet; //ClassFormule.LoadFromFile(MigrationFormule.QLFICHIER.NameFichier); with MigrationFormule do begin if MigrationFormule.QLFICHIER.ReadFichier = 0 then begin ProgressBar1.Min := 0; ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize; GaugeCtrlFic.MinValue:= 0; GaugeCtrlFic.MaxValue:= ProgressBar1.Max; i:= 0; //************************************************* //Lecture du max de chaque table pour le numéroteur //************************************************* FmaxDest:=1;//lDestination.QaysUtilBdd.GetNextNumFromTable('destination','destination_id'); FmaxFormule:=1;//lTarifFormule.QaysUtilBdd.GetNextNumFromTable('tarif_formule','tf_id'); FmaxGrille:=1;//lTarifGrille.QaysUtilBdd.GetNextNumFromTable('tarif_grille','tg_id'); FmaxOperateur:=1;//lTarifFormule.QaysUtilBdd.GetNextNumFromTable('operateur','ope_id'); //******************************************************* ProgressBar1.Min := 0; ProgressBar1.Max := MigrationFormule.QLFICHIER.GetSize; GaugeCtrlFic.MinValue:= 0; GaugeCtrlFic.MaxValue:= ProgressBar1.Max; i:= 0; if MigrationFormule.QLFICHIER.ReadFichier = 0 then begin Repeat i:= i+1; MigrationFormule.QLFICHIER.ReadLigne; //**************************************** GaugeCtrlFic.Progress := i; ProgressBar1.Position := i; if (i mod 1000)= 0 then begin LabelTimeToExport.Caption := IntToStr(i)+'/'+IntToStr(ProgressBar1.Max); Application.ProcessMessages; end; TempWork.LigneProgress:=MigrationFormule.QLFICHIER.Ligne; //**************************************** //if (copy(TempWork.GiveOccurence(3), 1, 6) = '200710') or // (copy(TempWork.GiveOccurence(4), 1, 6) = '200710') then //begin //****************************************************************************** if cur_ope <> TempWork.GiveOccurence(1) then begin cur_ope := TempWork.GiveOccurence(1); cur_date := ''; ClassOperateur.Filter := 'ope_nom_court='+''''+TempWork.GiveOccurence(1)+''''; ClassOperateur.Filtered:= true; ClassOperateur.Open; if ClassOperateur.RecordCount = 0 then begin ClassOperateur.Append; ClassOperateur.FieldByName('ope_id').Value := FmaxOperateur; ClassOperateur.FieldByName('ope_nom_court').Value := TempWork.GiveOccurence(1); ClassOperateur.FieldByName('ope_nom_long').Value := TempWork.GiveOccurence(1); ClassOperateur.Post; opeidinterne := FmaxOperateur; end else opeidinterne := ClassOperateur.FieldByName('ope_id').Value; end; //****************************************************************************** if cur_date <> TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4) then begin cur_date := TempWork.GiveOccurence(3)+' '+TempWork.GiveOccurence(4); cur_dest := ''; ClassGrille.Filter := 'DateDeb='+''''+TempWork.GiveOccurence(3)+'''' +' and DateFin='+''''+TempWork.GiveOccurence(4)+'''' ; ClassGrille.Filtered:= true; ClassGrille.Open; if ClassGrille.RecordCount = 0 then begin ClassGrille.Append; ClassGrille.FieldByName('id_grille').Value := FmaxGrille; ClassGrille.FieldByName('DateDeb').Value := TempWork.GiveOccurence(3); ClassGrille.FieldByName('DateFin').Value := TempWork.GiveOccurence(4); ClassGrille.Post; TgidInterne := FmaxGrille; end else TgidInterne :=ClassGrille.FieldByName('id_grille').Value; end; //****************************************************************************** if cur_dest <> inttostr(TgidInterne)+TempWork.GiveOccurence(10) then begin cur_dest := inttostr(TgidInterne)+TempWork.GiveOccurence(10); ClassDest.Filter := 'id_grille='+''''+IntTostr(TgidInterne)+'''' +' and destination='+''''+TempWork.GiveOccurence(10)+'''' ; ClassDest.Filtered:= true; ClassDest.Open; if ClassDest.RecordCount = 0 then begin ClassDest.Append; ClassDest.FieldByName('id_grille').Value := TgidInterne; ClassDest.FieldByName('id_des').Value := FmaxDest; ClassDest.FieldByName('destination').Value := TempWork.GiveOccurence(10); ClassDest.Post; destinationidInterne:=FmaxDest; end else destinationidInterne :=ClassDest.FieldByName('id_des').Value; end; //****************************************************************************** ClassPrefixe.Filter := 'id_grille='+''''+IntToStr(TgidInterne)+'''' +'and prefixe='+''''+TempWork.GiveOccurence(10)+'''' ; ClassPrefixe.Filtered:= true; ClassPrefixe.Open; if ClassPrefixe.RecordCount = 0 then begin ClassPrefixe.Append; ClassPrefixe.FieldByName('id_grille').Value := TgidInterne; ClassPrefixe.FieldByName('id_des').Value := FmaxDest; ClassPrefixe.FieldByName('prefixe').Value := TempWork.GiveOccurence(5); ClassPrefixe.Post; destinationidInterne :=FmaxDest end else destinationidInterne :=ClassDest.FieldByName('id_grille').Value; //****************************************************************************** tmp_formule := inttostr(TgidInterne)+' '+inttostr(destinationidInterne)+' '+TempWork.GiveOccurence(6)+TempWork.GiveOccurence(7)+TempWork.GiveOccurence(8); if cur_formule <> tmp_formule then begin cur_formule := tmp_formule; ClassFormule.Filter := 'id_Grille='+''''+IntToStr(TgidInterne)+'''' +' and iddes='+''''+IntToStr(destinationidInterne)+'''' +' and idjour='+''''+(TempWork.GiveOccurence(6))+'''' +' and TF_DATE_DEBUT='+''''+(TempWork.GiveOccurence(3))+'''' +' and TF_DATE_FIN='+''''+(TempWork.GiveOccurence(4))+'''' +' and TF_HEURE_DEBUT='+''''+(TempWork.GiveOccurence(7))+'''' +' and TF_HEURE_FIN='+''''+(TempWork.GiveOccurence(8))+'''' +' and TF_PRIX='+''''+(TempWork.GiveOccurence(9))+''''; if ClassFormule.RecordCount = 0 then begin ClassFormule.Append; ClassFormule.FieldByName('id_formule').Value:= FmaxFormule; ClassFormule.FieldByName('id_Grille').Value:= TgidInterne; ClassFormule.FieldByName('id_des').Value:= destinationidInterne; ClassFormule.FieldByName('idjour').Value:= StrToInt(TempWork.GiveOccurence(6)); ClassFormule.FieldByName('TF_DATE_DEBUT').Value:= TempWork.GiveOccurence(3); ClassFormule.FieldByName('TF_DATE_FIN').Value:= TempWork.GiveOccurence(4); ClassFormule.FieldByName('TF_HEURE_DEBUT').Value:= TempWork.GiveOccurence(7); ClassFormule.FieldByName('TF_HEURE_FIN').Value:= TempWork.GiveOccurence(8); ClassFormule.FieldByName('TF_CNX_DUREE').Value:= '0'; ClassFormule.FieldByName('TF_CNX_COUT').Value:= '0'; ClassFormule.FieldByName('TF_PRIX').Value:= TempWork.GiveOccurence(9); ClassFormule.FieldByName('TF_PAS').Value:= '0'; ClassFormule.Post; end end; //end; Until MigrationFormule.QLFICHIER.FinFichier; MigrationFormule.QLFICHIER.CloseFichier; end; end; end; ShowMessage('Commencé à'+timeTostr(datedebut)+' et terminé à '+TimeToStr(now)); end;
oioi, alors c'est trop pour moi
ok, je vois que tu utilise delphi.net, moi je suis toujour au delphi 6, (vieux age>30 ans)
mais si tu peut utlisé blockread et blockwrite, je peut taidé si, nonj'ai rien à faire ici
bon nuit
au il s'agit d'un fichier csv comme suit:
avec un minimum de 1 500 000 lignes minimu a chaque fois, et chaque occurence doit être lut cat il n'y a aucun doublons dans ce fichierabc;adefded;bded;1;
abcded;deded;beddb;47;
fgfg;bede;abc;29;
en fait je doit récupéer le nom de l'operateur le sauvegarder de façon unique
recherche les grille de date et les sauvegarde de façon unique
recherche le prefixe et les sauvegarde de façon unique
recherche la formulz et les sauvegarde de façon unique
ensuite cela donne un minime de 600000 à 800000 lignes qui ont été sauvegardé et qui devront être insérer en base de doonées
de toutes les fçcon vous allez conprendre la "logique" en lisant les algos
edam non tu n'es pas vieux , mois aussi j'ai plus de 30 ans, c'es mon boss qui veux impréssioner ces chefs![]()
ok, merci
1- tu utilise le filtrage sur Ta Clientdataset, mieux utliser Locate
2-tes id (idgrill, idmax, ..) tu les incrémante pas????????
3- tu fait trop de coparésant en utlisant des strings surtout la convetion des nbr en string avant la comparésant
bah il y a bcp d'ptimisation à faire vraiment bcp
Partager