Csv, csvlist, tstringlist

Soyez le premier à donner votre avis sur cette source.

Vue 7 330 fois - Téléchargée 1 211 fois


Description

Voici une unité qui surcharge la classe TStringList pour prendre en charge des données CSV.

L'utilisation est très simple et pratique, une aide en HTML est fournie et deux Demos pour en montrer la simplicité et l'utilisation avec des objets standards tel TListBox et TStringGrid.

Fonctionne avec les CSV à champs protégé à partir de D5, tel que : "a","b","c"

Fonctionne avec les CSV de divers format à partir de D2006

Possible problèmes (non testé) avec Delphi XE

ChangeLog :

02/12/12 CSVList et démos
#fixé : non compatibilité entre [D5..D2005], [D2006..D2009], [D2010+]
#fixé : utilisation de StrUtils
#fixé : bug sur la procedure DrawItem dans la demo TListBox
#fixé : bug sur la déclaration de strictDelimiter dans la demo TStringGrid
#ajout : vous pouvez utiliser les directives DO (D5 à D2005), DG (D2006 à D2009), DX (D2010+) dans vos programmes en déclarant CSVList dans les uses de l'interface

02/12/12 Aide
#ajout : projet d'aide vide prés à l'emploi dans empty.help.project.zip
#fixé : bug dans le core AJAX de l'aide.
#fixé : prise en charge des liens externe dans le menu principal.
#fixé : prise en charge incorrecte des ancres de page. vous pouvez désormais appelé une page correctement par son ancre : help.aide.html#pagename
#modifié : !IMPORTANT! les pages d'aide sont maintenant appelée "pg_*.html" seul les fichiers du core gardes leurs noms (menu.html, config.cfg, help.css, helpfix.css, override.css)
#modifié : maintenant le fichier principal de l'aide ne contient plus aucunes informations sur l'aide de votre projet.
#ajout : !IMPORTANT! configuration de l'aide (titres, icon, page par défaut) via help/config.cfg (format JSON).
#ajout : fichier override.css pour surcharger/ajouter vos propres styles

Conclusion :


Vous pourrez vous rendre compte que malgré tout ce qu'on pourrait croire, c'est performant et fluide à l'utilisation.

J'utilise cette technique au boulot pour lire, ecrire, editer ou transformer de gros fichiers CSV (catalogue fournisseurs, base de données client etc) sans rencontrer le moindre problème, même sur d'énormes catalogues de >30Mo (> 60000 références).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Non... j'ai finalement chargé mon fichier csv dans une StringList normale, et je traite ensuite ligne par ligne en utilisant une StringList csv.
Ce n'est peut être pas optimal mais ça fonctionne!
Merci pour ta réponse.
NHenry
Messages postés
14567
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 octobre 2019
136 -
Le fichier ne serait occupé par un autre programme ?
Bonjour,
J'ai un problème avec la fonction LoadFromFile, je suis pourtant ce qu'il y a sur l'aide...
J'ai donc une erreur "Access violation" lors du LoadFromFile:

Procedure TGestionnaireDonnees.ParseCSV(NomFichier: String);
Var
Liste: CSVList.TStringList;
s : String;
i : Integer;
Begin
i := 0;
FTab := Nil;
Liste := TStringList.CreateAsCSV(#0, '|');
Liste.LoadFromFile(NomFichier); <====== Acces Violation
For s In Liste Do
Begin
SetLength(FTab, Length(FTab) + 1);
FTab[i] := StrToFloat(s);
Inc(i);
End;
End;

L'erreur ne vient pas de NomFichier car quand je mets un nom qui n'existe pas, l'erreur est bien une erreur de fichier inexistant.
Vous avez une idée de ce qui peut causer cette erreur?
Merci de votre réponse.

Edit: extrait du fichier .csv:

Id|Date|Heure|NUMERO LOT|VALEUR|VALIDITE
3|01/11/2013|0853|48241|4400|VALIDE *VALIDE
3|01/11/2013|0854|48242|12320|VALIDE *VALIDE
3|01/11/2013|1402|48241|1320|VALIDE *VALIDE
3|01/11/2013|1403|48242|13640|VALIDE *VALIDE
3|02/11/2013|0750|48241|1320|VALIDE *VALIDE
3|02/11/2013|0751|48242|17160|VALIDE *VALIDE
1|02/11/2013|0756|48241|4400|VALIDE *VALIDE
1|02/11/2013|0802|48241|2200|VALIDE *VALIDE
1|02/11/2013|0802|48242|16720|VALIDE *VALIDE
2|02/11/2013|0808|48241|2640|VALIDE *VALIDE
2|02/11/2013|0809|48242|11440|VALIDE *VALIDE
2|02/11/2013|1707|48241|2640|VALIDE *VALIDE
2|02/11/2013|1707|48242|12320|VALIDE *VALIDE
3|02/11/2013|1958|48241||VIDE *VIDE
3|02/11/2013|2003|48241|2200|VALIDE *VALIDE
3|02/11/2013|2004|48242|11440|VALIDE *VALIDE
3|03/11/2013|1119|48241|3520|VALIDE *VALIDE
3|03/11/2013|1120|48242|14080|VALIDE *VALIDE
cs_yanb
Messages postés
248
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 mars 2016
5 -
Bonjour foxi,

je le trouve pas mal du tout le fichier d'aide :p
Bon ok j'arrive un peu après la bataille :(
Donc voilà il y aurait peut-être des petites modifications à faire dans le css pour que ton menu apparaisse quand tu redimensionnes la fenetre
body{min-width:1024px;margin:8px;}/*j'ai pris left 836 + width 188*/
#menu{position:absolute;left:836px;display:block;background-color:#444;color:#eee;width:188px;min-height:120px;box-shadow:0 0 3px #666;padding:8px 0;}

Ensuite dans le menu.html
J'aurai bien mis des balises ul et li style

* ["#about">A propos</li>

* </script>

Ah oui il doit manquer les balises dt dans les exemples
<dt>
Exemple :

</dt>
Je connaissais pas les MetroPic va falloir que je regarde ca de plus prêt ca à l'air pas mal :p
Bon je sais pas ce que tu en penses mais voilà au moins c'est pas inconstructif ;)
@+
cs_systmd
Messages postés
46
Date d'inscription
mercredi 25 février 2004
Statut
Membre
Dernière intervention
29 août 2012
-
Bonsoir foXi

J'ai rajouté {$Define DO} aprés {$R *.dfm} dans les Main.pas
et supprimer Application.MainFormOnTaskbar := True; dans les dpr et tout et rentré dans l'ordre.

Compile avec D7

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.