Bonjour,
je cherche la methode ou fonction equivalante a split de vb pour delphi
qui me permet de recuper les donner avant le ; ou :.
ex
nom;prenom; adresse;
lit et inser tableau nom puis prenom puis adrresse et ne tenat pas compte du ;
merci
Version imprimable
Bonjour,
je cherche la methode ou fonction equivalante a split de vb pour delphi
qui me permet de recuper les donner avant le ; ou :.
ex
nom;prenom; adresse;
lit et inser tableau nom puis prenom puis adrresse et ne tenat pas compte du ;
merci
Regarde du côté de TStrings/TStringList, Delimiter et DelimitedText.
Il y a la FAQ aussi :
http://delphi.developpez.com/faq/?pa...chaine#explode
Bloon
Attention le DelimiterText pose des problèmes avec le #0 considéré comme fait de chaine ou séparateur, je ne sais plus, il élimine les char de #1 à ' ', considère ce dernier comme un séparateur, la fonction de la FAQ est fiable dans de nombre cas, mais elle est lente lorsque l'on a des fichiers de plusieurs Mo à traiter, j'ai donc fait la mienne :
ATTENTION, la Fonction Explode de la FAQ, ou la suivante, ne sont pas faite pour du CSV, il faut gérer pour cela le " et le ; !!!
Code:
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 {* ----------------------------------------------------------------------------- la fonction Explode retourne un tableau de chaînes. Ce sont les sous-chaînes, extraites de S, en utilisant le séparateur Separator. @param S Chaine à découper @param A Tableau de Chaine qui recevra la découpe @param Separators Caractères qui délimitent une chaine pour la découpe @param ExcludeEmpty Si True, les Chaines vides ne sont pas insérés dans le Tableau @return Nombre de Séparateur Trouvé (peut-être différent du nombre de chaine dans A !) ------------------------------------------------------------------------------ } function Explode(const S: string; out A: Types.TStringDynArray; const Separators: string; ExcludeEmpty: Boolean = False): Integer; var iLesSep: Integer; function IsSeparator(const C: Char): Integer; begin for Result := 1 to iLesSep do if C = Separators[Result] then Exit; Result := -1; end; var iStr: Integer; iLenS: Integer; iLenSS: Integer; iLenA: Integer; iBegin: Integer; iExclude: Integer; begin iLenS := Length(S); if iLenS = 0 then begin SetLength(A, 1); Result := 0; A[Result] := ''; Exit; end; iLesSep := Length(Separators); iLenA := 0; for iStr := 1 to iLenS do if IsSeparator(S[iStr]) > 0 then Inc(iLenA); if IsSeparator(S[iLenS]) > 0 then Inc(iLenA); SetLength(A, iLenA); iBegin := 1; iLenSS := 0; Result := 0; iExclude := 0; for iStr := 1 to iLenS do begin if IsSeparator(S[iStr]) > 0 then begin if ExcludeEmpty and (iLenSS = 0) then begin iBegin := iStr + 1; Inc(iExclude); end else begin A[Result] := Copy(S, iBegin, iLenSS); Inc(Result); iBegin := iStr + 1; iLenSS := 0; end; end else Inc(iLenSS); end; if Result < iLenA then A[Result] := Copy(S, iBegin, MaxInt); if ExcludeEmpty and (iExclude > 0) then A := Copy(A, 0, iLenA - iExclude); end;
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 {* ----------------------------------------------------------------------------- la fonction ExplodeToStrings encapsule Explode pour renvoyer une liste. @param S Chaine à découper @param A Tableau de Chaine qui recevra la découpe @param Separators Caractères qui délimitent une chaine pour la découpe @param ExcludeEmpty Si True, les Chaines vides ne sont pas insérés dans le Tableau @return Nombre de Séparateur Trouvé (peut-être différent du nombre de chaine dans A !) ------------------------------------------------------------------------------ } function ExplodeToStrings(const S: string; L: TStrings; const Separators: string; ExcludeEmpty: Boolean = False): Integer; var A: Types.TStringDynArray; iL: Integer; begin if Assigned(L) then begin Result := Explode(S, A, Separators, ExcludeEmpty); L.Clear(); L.Capacity := Result; for iL := Low(A) to High(A) do L.Add(A[iL]); end else Result := -1; end;
Pourquoi reinventer la roue?
http://www.whitepeaksoftware.com/wps...i_library.aspx
Et voilà un CSV parser en deux coup de cuilleres à compote de pomme
merci de vos reponse je n'ai pas eu encore le tmps de tester j'espere ce WK-end;)
j'ai lu la faq mais j'ai pas vue le code .
Peche de jeunesse.
merci
Merci pour le composant mais je debute je n'arrive pas a installer erreur sur £region
et comment je l'utilise
delphi comme version
merci
Les paramètres $REGION sont des infos du code rétractable qui existe depuis BDS2005. Quelle version de Delphi utilises-tu?Citation:
Envoyé par scarecrow1
Sinon, n'hésite pas à supprimer ces directives.
C'est vendredi soir, je vais donc faire la fete... Mais... Shaaazzzamm j'ai une autre Classe qui fait le travail chez moi... Je ne sais plus d'ou elle vient... Elle fonctionne sous D5 à D7 sans probleme (au dela non testé)... Je vais mettre le code cette nuit ou demain matin sur ce topic... Ca fera 2 classes pour 1 travail. C'est classe non?Citation:
Envoyé par scarecrow1
pas vu que j'ai pas mis 7
donc delphi 7
Bon,
le code de la FAq est super il faut que j'essaye de l adapter pour que ca rentre ds un tableau .
merci
bon wk
bon pour le code pas bon
en tout cas je n'arrive pas a lui faire lire le fichier.
ca marche bien pour une ligne ds un text(composant)
Mais pas moyen de faire lire le fichier .
erreur string text.
je cherche
merci:)
Bon voilà une classe qui lit les fichiers csv sous delphi 7
le code n'est pas de moi mais je ne suis pas capable de retrouver d'ou il vient...
Donc merci à l'auteur...
Cela repond t-il a ta demande?Code:
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 unit CSV_File; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TCSV_File = class(TObject) private Fr : TextFile; Nom_Fichier : String; Liste_Parametres : TStringList; public Function Open(Nom_Fichier_CSV : String) : Integer; Procedure Close; Function Eof : Boolean; Function ReadLine : Integer; Function N_Parametre(Index : integer) : string; end; implementation // Ouvre un fichier CSV en lecture Function TCSV_File.Open(Nom_Fichier_CSV : String) : Integer; begin // Teste si fichier existe if FileExists(Nom_Fichier_CSV) then Begin Nom_Fichier:=Nom_Fichier_CSV; AssignFile(Fr, Nom_Fichier_CSV); { File selected in dialog box } Reset(Fr); // Init de la Liste de paramètres Liste_Parametres:=TStringList.Create; Result:=0; end else Result:=1; end; // Ferme un fichier CSV Procedure TCSV_File.Close; begin // Ferme fichier System.CloseFile(Fr); // Détruit liste associée. Liste_Parametres.Free; end; Function TCSV_File.Eof : Boolean; begin // test fin du fichier Result:=System.Eof(Fr); end; Function TCSV_File.ReadLine : Integer; var Reste,Ligne255 : String; Pos_S : Integer; begin Liste_Parametres.Clear; Result:=0; // Lit une ligne de paramètres ReadLn(Fr,Ligne255); // Parsing Ligne While Ligne255<>'' do begin Pos_S:=Pos(';',Ligne255); If Pos_S=1 then // Virer le séparateur Delete(Ligne255,Pos_S,1) else begin // si trouvé un séparateur alors if Pos_S<>0 then begin // Isoler le paramètre Reste:=Copy(Ligne255,1,Pos_S-1); // Virer tout ça de la ligne! Delete(Ligne255,1,Pos_S); end else // si plus de séparateur begin // C'est tout le reste, fin! Reste:=Ligne255; Ligne255:=''; end; Liste_Parametres.Add(Reste); Inc(Result); end; end; end; Function TCSV_File.N_Parametre(Index : integer) : string; begin Result:=Liste_Parametres.Strings[Index]; end; end.
Merci c 'est super sympa
mais je ne connais que le code et encore je suis a la rammasse je ne sais pas installer un composant ou une classe et comment l'utilise, j'ai fait ds recherche mais j'ai rien trouve comme explication (site michel barnoud sur creation e compasant mais j'ai pas l'ancetre??
desole d 'ertre aussi mauvais, je devrait me content de faire du reseau et vbs;)
Bon j ai cherche sur les classe et composant
Pour un composant il faut trouve l'ancetre la ds ce cac tobject mais je ne l'ai pas trouve ds le menu deroulant.
je pense que c'est une autre methode qu il faut utilise
je cherche encore merci
je vais te faire un petit .zip avec la classe (pas besoin de l'installer tu la rajoutes justes dans la clause uses) et un exemple d'utilisation...Citation:
Envoyé par scarecrow1
Ok?
Peut-être d'ici lundi soir...
Bon dev d'ici là, ce n'est pas la seule methode, mais elle est très simple et AMHA tu ne peux/dois pas utiliser delphi et faire l'impasse sur les classes.
Tout l'interet de delphi c'est la POO...
Un peu d'efforts qui te rapporterons un gain de temps inimaginable.
Merci
je sais utilise une unit mais les classes balaise sur tout trouve une utilite et savoir la faire marche
merci de l'aide.
ps je suis pas devellopeur(ca du se voir, je travail seul pour le plaisir)
voici donc le zip d'origine que j'ai trouvé il y a bien des années pour lire les CSV... Il y a un projet d'exemple dedans.
Par contre la gestion de tes tableaux t'appartient toujours...
Normal quoi.
Bon voilà, tu l'utilises ou pas... Comme tu veux..
Mais un coup d'oeil sur les codes des mes co-forumer ou sur la classe que j'ai posté et tu as les réponses à tes questions (avec plusieurs approches différentes).
Perso je considère ce topic comme resolu.
Bon DEV...
Au fait...Merci à l'auteur ... J'aurais bien voulu donner la source, mais je ne sais vraiment plus qui c'est... Ca date... Heureusement je garde tous le codes que je trouve dans une bdd.
Pratique non?
Merci je vais mettre resolu pour le moment si j'arrive pas je serai de retour + tard:)
Je signale juste que ce soit la fonction proposé par le zip de darkvadr ou le composant WPS, ces fonctions sont excessivement lentes pour décomposer le buffer csv, l'utilisation d'une concaténation char par char, ou le delete, ne sont pas dignes d'une library professionnels, trop couteux en opérations mémoires inutiles ... je dis cela, car ayant eu a travaillé des fichiers de plusieurs centaines de Mo, la différence peut se sentir sur des machines des clients encore en Win95/98 avec très peu de RAM ...
personnellement, faire sa fonction de découpage csv, est un bon exercice, c'est assez standard et cela pousse à faire un peu de réflexion pour écrire son algo ...