CSV, CSVLIST, TSTRINGLIST

dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 - 18 nov. 2012 à 10:08
 Polimax - 31 mars 2014 à 11:11
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54750-csv-csvlist-tstringlist

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 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
30 mars 2014 à 19:42
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 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
19 déc. 2012 à 00:16
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 41 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 29 août 2012
3 déc. 2012 à 23:22
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
cs_systmd Messages postés 41 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 29 août 2012
2 déc. 2012 à 21:02
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
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
30 nov. 2012 à 11:19
Je poste le projet modifié
pour Delphi -> HTML il faudra juste que je l'améliore !!
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
30 nov. 2012 à 09:37
rooo, le créer automatiquement, c'est pas super grave...
Par contre, pour des idées de dev, si on pouvait personnaliser les couleurs, images, thèmes, tout ça quoi... Moi je suis une bille en html (et en plus ça ne m'intéresse pas) donc je ne serai pas d'un grand secours. Ceci dit, je trouve le concept super intéressant, et je rêve d'un petit DelphiToHml pour faire des jolis fichiers d'aide...
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
29 nov. 2012 à 20:32
Cantador <tu aurais pu le créer automatiquement..>
J'avais essayé le le mettre dans un Tlistbox invisible mais ça pas bien marché
Je vais réessayer mais sans garantie !
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 nov. 2012 à 19:43
Ouaip, vu, il est dans le zip.
Sympa, bien sympa même... Mais j'espère qu'on aura droit à ta version quand même f0xi !!! :)
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 nov. 2012 à 19:21
il faut mettre le fichier "help.aide.h"

tu aurais pu le créer automatiquement..
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
29 nov. 2012 à 17:18
pour que la création du html fonctionne il faut mettre le fichier "help.aide.h" contenu dans le zip dans le même répertoire que l'exécutable.
il faut aussi mettre le fichier source CSVList.lxh et le charger avec l’exécutable pour recréer le HTML de foxy (à peu près)
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 nov. 2012 à 16:07
A DUBOIS77 :
Je viens de tester le générateur (juste l'exécutable). (On sort un peu du sujet...)
Avant tout, un bug sur le bouton "Créer html", et j'ai une erreur, le programme cherche un fichier "help.aide.h"...
Par ailleurs, l'enregistrement des fichiers semble un peu aléatoire (la meilleure façon semble être d'appuyer sur entrée dans le cadre de texte, mais si je clique sur une rubrique, ça ne s'enregistre pas forcément...)
Marrant ce preview d'impression, c'est fait maison ?
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 nov. 2012 à 15:58
Mais oui !!! Postez donc M. Dubois !!!
:)
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
29 nov. 2012 à 15:54
Salut Foxy, me revoilou !

J'ai un peu bossé sur le générateur de help comme vu plus haut
le source est pour l'instant disponible ici : http://sports.roissy.free.fr/delphi/genhlp.zip
l’exécutable ici : http://sports.roissy.free.fr/delphi/genhlp.exe

Si tu penses que cela peut intéresser quelqu'un, je peux poster
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
29 nov. 2012 à 14:52
Bonjour,

D'une manière générale, je propose à Nix, lors d'un dépôt de source que l'auteur saisisse
la version de delphi avec laquelle son projet a été construit.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 nov. 2012 à 11:51
mmm en fait : le code est plus compatible à partir de D2005/2007 ... n'ayant plus D7 (je suis sur D2009) je ne peux pas tester.
Je vais modifier pour prevenir que le code est compatible à partir de D2k5 (pas sur) - 2k7 (sans soucis)
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 nov. 2012 à 10:15
D7 Entreprise v7.0 (build 4.453)
papyvore Messages postés 223 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 16 décembre 2021 15
29 nov. 2012 à 10:10
Bonjour
TTextFormats doit faire parti d' unit graphics XE.... dans D7 ça plante aussi sur ce format.
a simonpelloquin aurait tu une autre version que D7 installée??
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 nov. 2012 à 09:10
Bizarre ça...
Moi ça marche bien et j'ai regardé dans l'unité graphics, je n'ai pas de trace de TTextFormat... Tu es sûr que l'erreur ne vient pas d'autre chose ?

Pauvre f0xi... :)
cs_systmd Messages postés 41 Date d'inscription mercredi 25 février 2004 Statut Membre Dernière intervention 29 août 2012
28 nov. 2012 à 19:33
Bonsoir FOXI
moi aussi entre le code ou ton fichier d'aide ...

simonpelloquin dit que ça fonctionne sous D7, mais moi j'ai un problème. Outre le StrictDelimiter := true; dans le constructeur à supprimer, erreur de compilation TTextFormat inexistant dans graphics
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
27 nov. 2012 à 15:04
Bon, bonne nouvelle, ça fonctionne sous D7 (sauf qu'il faut enlever le StrictDelimiter := true; dans le constructeur) :)
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
27 nov. 2012 à 12:04
J'aimerais bien suivre où s'en va delphi à l'appel du savetofile, mais le pas à pas approfondi ne rentre pas dans la fonction du stringlist...

Est-ce que tu reproduis ?
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
27 nov. 2012 à 11:55
hé, prends moi pour un noob...
Je fais le SaveToFile sur ta stringlist !

:D
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
27 nov. 2012 à 11:44
Lol arrête l'investigation je sais pourquoi sa déconne :

faut pas faire :

ListBoxX.SaveToFile() <- l'IDE aurait du te dire "membre inconnus" ou "fonction n'existe pas"

il faut faire :

ListBoxX.Items.SaveToFile() <- la c'est bon :)
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
27 nov. 2012 à 09:11
tadaaaaa !!!

Alors, petite erreur sur la demo TStringGrid. Sur le formCreate c'est "CSVFirstRowAsNames" et non "FirstRowAsNames", mais bon, ce n'est pas très grave... ;)

J'ai ajouté sur les deux démos un bouton. Sur le click de ce bouton, j'ai mis simplement : db.SaveToFile(ExtractFilePath(ParamStr(0))+'test.csv');

Ça fonctionne bien sur le tstringgrid (pas de message d'erreur, fichier généré), en revanche sur la demo listbox, je retrouve ma violation d'accès (je vide la liste, je clique deux ou trois fois sur "ajouter", puis j'essaie d'enregistrer, ou je clique directement sur mon bouton).

Est-ce que tu as le même problème ?
Est-ce qu'une âme charitable équipée d'XE2 pourrait essayer de reproduire le problème (histoire de savoir si ça vient de ma config...) ?
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 nov. 2012 à 19:23
@Simon :

J'ai ajouté deux demo, compiles les et vois si ça marche. Ci c'est le cas, c'est que t'as "couillé" quelque part :), si ça marche pas ... c'est qu'il y a un truc qui m’échappe et je ne vois pas quoi.
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
26 nov. 2012 à 11:39
ok, c'est bien plus clair. Je vois mieux l'intérêt de la chose.
Bon, par contre, c'est pas que l'envie me manque, mais malheureusement je n'arrive pas à la faire fonctionner sous les deux IDE que j'utilise (D5 et XE2).
J'ai enlevé la surcharge avant le TForm, mais sans succès...
:(
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
26 nov. 2012 à 11:31
Tout est dans les exemples dans l'aide.

La stringlist reste une stringlist, juste il y a de nouvelles propriétés pour gérer les données CSV.

on peu l'utiliser pour "parser" une seule ligne CSV (propriété CSV qui transforme chaque colonne CSV en une ligne dans la stringlist) ou un fichier CSV chargé à l'intérieur (puis lire/modifier avec CSVFields).

Tu n'as pas besoin de surcharger TStringList avant le TForm. le fait de déclarer CSVList suffit à activer la surcharge.
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
26 nov. 2012 à 10:38
Bon, désolé mais même avec les modifs que tu m'as dit de faire, j'ai toujours la même erreur.

Par ailleurs, je ne suis pas sûr de bien saisir le fonctionnement de ta surcharge. J'avais cru que la stringlist devenait une sorte de fichier CSV, mais j'ai l'impression à la lecture de ton code et du fichier d'aide qu'on ne peut écrire qu'une ligne, à moins de charger au préalable un fichier csv.

A partir de ta description suivante (qui pour moi est ambiguë) :
property TStringList.CSVFields[row, col: integer]: string;
CSVFields permet de lire ou d'écrire un champ dans les données CSV multilignes contenues dans la TStringList.
Uniquement fait pour lire les champs dans plusieurs lignes CSV.

Peut-on créer un CSV multiligne à partir de ta surcharge ? (si oui, comment ?)
La propriété CSVFields est-elle en lecture seule (il y a une méthode setField...) ?
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
24 nov. 2012 à 01:02
Ah oui c'est bon je l'ai vus.

corrige comme ceci :

slDossier dans le public de TForm :

TForm1 = class(TForm)
public
slDossier : TStringList;
end;

puis :

ne pas créer slDossiers dans le onActivate mais dans le onCreate ! (onActive peut ne pas être exécuter)
ne pas libérer slDossiers dans le onClose mais dans le onDestroy ! (onClose peut ne pas être exécuter)
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
24 nov. 2012 à 00:59
Je ne vois pas la déclaration de slDossier ... var ? dans TForm ?

je ne trouve nul part ceci :

slDossier : TStringList;

sinon le code pour l'ajout de CSV est faux, il faut faire :

slDossiers.CSV != Test1+';'+Test2+';'+Test3+';;;;'

ou

slDossiers.Add(Test1);
slDossiers.Add(Test2);
slDossiers.Add(Test3);
slDossiers.Add('');
slDossiers.Add('');
slDossiers.Add('');
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
23 nov. 2012 à 10:24
Message d'erreur :
Le projet Project1.exe a déclenché la classe d'exception $C0000005 avec le message 'violation d'accs 0x00428543 : lecture de l'adresse 0x00000000'

Embarcadero® Delphi® XE2 Version 16.0.4429.46931
Update 4

XP pro sp3
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
23 nov. 2012 à 10:19
A noter que si j'enlève la surcharge, le code fonctionne. (et heureusement...)
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
23 nov. 2012 à 10:13
f0xi:

Pour delphi 5, je suppose qu'on est d'accord, peu importe le code, le problème vient de l'unité manquante... ;)

Pour XE2 :
J'ai enregistré le fichier csvList.pas dans un dossier "Surcharge_Compos" (Ce dossier étant référencé dans les chemins de bibliothèques de delphi).

Dans ton code, j'ai modifié le creator pour donner des valeurs par défaut à ses paramètres :
- Dans la section Public : constructor CreateAsCSV(aProtector : Char '"'; aDelimiter: Char ';'); reintroduce; virtual;

- Dans l'implémentation :constructor TStringList.CreateAsCSV(aProtector : Char '"'; aDelimiter: Char ';');

Ci dessous le code qui plante :

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CSVList;

type
TStringList = class(CSVList.TStringList);
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
Form1: TForm;

slDossiers : TStringList;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
slDossiers := TStringList.CreateAsCSV();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
sVar1,
sVar2,
sVar3 : string;
begin
sVar1 := 'Test1';
sVar2 := 'Test2';
sVar3 := 'Test3';
slDossiers.Add(sVar1 +';'+ sVar2 +';'+ sVar3 +';;;');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// Ici, ça plante
slDossiers.SaveToFile('C:\Test.csv');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
slDossiers.Free;
end;

end.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 nov. 2012 à 19:30
@simon:
peut tu me donner ton code qui provoque l'erreur ?
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
22 nov. 2012 à 11:20
f0xi,

J'ai une violation d'accès sur un savetofile('C:\Test.txt') sous XE2. Est-ce propre à XE2 ?

Par ailleurs, ton (joli) fichier d'aide précise que les versions de delphi sont de 5 à 2010. Or sur D5, il n'y a pas l'unité strutils... (je voulais tester si j'avais la même violation d'accès)
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
20 nov. 2012 à 11:11
Salut f0xi !
Bé moi, je ne sais pas ce que je préfère, le code csvList ou ton fichier d'aide html... (malgré ses quelques fautes d'orthographe ;) )
un petit 10 pour le lot !
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 nov. 2012 à 20:59
Fait, je prépare un petit programme pour l’éditer facilement, ajouter des menus, des blocs etc.
Bien entendus le fichier est 100% FREE et open, donc tu peux le reprendre à ta guise.
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
18 nov. 2012 à 10:08
Salut Foxy
Je ne peux qu'approuver, étant donné que cela ressemble furieusement à ma GestH de mon unité Systus (voir commentaires précédents)
J'ai auusi bien aimé le module HTML que je vais surement me réaproprier pour faire des fichiers doc : génial
Pour tout cela je note !
Rejoignez-nous