Bonjour,
je voudrais savoir quelles sont les commandes pour ouvrir, lire ligne par ligne, et fermer un fichier excel .csv en delphi. Merci,
Arthur
Bonjour,
je voudrais savoir quelles sont les commandes pour ouvrir, lire ligne par ligne, et fermer un fichier excel .csv en delphi. Merci,
Arthur
Il n'y a pas de commande spécifique au CSV, tu peux prendre la fonction Explode sur Phidel.com (parti units), pour splitter une ligne csv, lu par readLn par exemple (quoi que peu posé aussi des problèmes aussi avec les retour charriot dans une valeur), une TStringList.LoadFromFile, me semble peu fiable pour les même raison, ... je conseille le readln si il n'y a pas de retour charriot dans les valeurs ...
Donc sinon, un TFileStream ou un BlockRead sur un File of Byte, qui lit le fichier en détectant les quote, les ; et retour charriot ...
sinon, tu cherche sur le web, tu as un bun TCSVReader qui doit existé non ?
ok merci je vais chercher un parser sur le net
tu peux simplement utiliser une TStringList avec son LoadFromFile(...).
Après tu parses tes lignes une à une pour séparer les champs CSV !
Il me semble aussi (mais à vérifier) que la JVCL proposait un fournisseur de donnée CSV qui pouvait alimenter un TDataSet ... à vérifier je m'en souvient plus exactement.
Cordialement
Octal
Bonjour,
Un fichier CSV n'est rien d'autre qu'un fichier texte avec des séprateurs, je te conseil d'utiliser les fonction pascal d'ouverture, lecture et fermeture des fichier texte.
C'est super simple d'utilisation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 VAR F:TextFile; begin {$I-} assignFile(F,FICHIER.CSV); FileMode := 0; Reset(F); {$I+} repeat ReadLn(F,Ligne); Until EOF(F); CloseFile(F);
Cordialement
Qays
Avec la StringList, il faut bien spécifier le Delimiter et le QuoteChar, ... personnellement, j'ai eu quelques effets de bords, avec des retours charriot DANS une valeur,
idem avec le ReadLn, faut gérer les retour charriot encadrés de quote ...
Il y a également un bon composant dans la JVCL
jv Jans CSV
Je n'ai jamais dit qu'il fallait utiliser le StringList pour parser les champs. Il faut juste utiliser le StringList pour lire le fichier en mémoire de manière à pouvoir lire les lignes dirctement dans le style lst[1]... lst[2]... et ainsi de suite, chaque lst[n] est une ligne contenant une ligne CSV de ton fichier.Envoyé par ShaiLeTroll
Après il faudra parser la ligne en récupérant les champs séparé par n'importe quel séparateur.
faire un
C''st quand même plus simpa que le Readln et writeln du vieux Pascal ....
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 var StrLst : TStringList; begin StrLst := TStringList.Create; try try StrLst.LoadFromFile('monfichier.csv'); // Faire n'importe quel traitements sur les liggnes // Chaque ligne etant // StrLst[0] = valeur1 , valeur 2 , ..... valeurN // StrLst[1] = valeur1 , valeur 2 , ..... valeurN // StrLst[2] = valeur1 , valeur 2 , ..... valeurN // ... // StrLst[count-2] = valeur1 , valeur 2 , ..... valeurN // StrLst[count-1] = valeur1 , valeur 2 , ..... valeurN except on e : exception do showmessage('Erreur au chargement' + e.message); end; finally StrLst.Free; end; end;
Le seul interret à utiliser l'ancienne méthode Pascal (ReadLn/WriteLn) séquentielle est le cas où le fichier et vraiment trop gros ... là cette méthode est plus pratique parce qu'elle ne charge qu'une ligne à la fois. maintenant quand je dit GROS fichier je parle de fichiers dépassant les 5Mo en moyenne, parce que franchement, en dessous, sur un P4 moderne c'est tjr jouable avec un TStringList sans aucun pb.
Cordialement
J'ai bien compris que la TStringList servait de "FileReader" mais le problème via des caractères charriot contenu dans le csv, ... et décale donc tes "lignes", ... il est vrai qu'il y a rarement des retour charriot dans les valeurs, mais cela peut arriver ...
Des retours chariots dans les CSV ??? on nous etonnera tjr !Envoyé par ShaiLeTroll
Exemple, un export du Vidal, tu auras les prescription en texte, et il y a des retours à la ligne ... sinon tu n'as qu'a essayé avec Excel, tu peux mettre plusieurs lignes (ALT+ENTER), et regarde le beau fichier ...
Sinon un export CSV for MS Excel de PhpMyAdmin d'une base MySQL, ... idem ...
Oui mais dans ce cas là tu aura tjr le pb des retours chariot avec le ReadLn et WriteLn du bon vieux Pascal.
Le seul moyen est d'utiliser un BlockRead (lecture en binaire) de ton flux que tu mettra dans un buffer et tu devra parser ton buffer manuellement !
Cordialement
Bonjour,
A propos de retour chariot..
J'ai besoin de stocker les données d'un StringGrid dans un fichier
(j'ai choisi le format CSV)
toutes mes données sont simples, pré-digérées sauf une qui le texte libre d'un mémo qui peut bien entendu recevoir des retours chariots..
j'arrive à les retirer avant le stockage mais j'aurais aimé toutefois les voir revenir lors de l'affichage de ce mémo dans sa cellule du StringGrid
uniquement par souci d'esthétique !
merci de vos conseils
remplacer les retour charriot par des "¶" (#B6)
Ainsi cela ne complique pas ta lecture CSV, et tu peux affiché dans ton mémo le texte libre ou tu remplace les "¶"
Une solution avec ADO
http://www.developpez.net/forums/sho...d.php?t=253362
Merci ShaiLeTroll
je vais tester...
@bientôt
les "¶" m'ont mis une panique dans une StringList
une modification en entraînant une autre puis une autre..
bref il faut que je récrive tout.
et il y a une tonne d'informations à propos du sujet sur le forum !
Quant à ADO, non merci Access me file des boutons..
Voilà désolé pour le dérangement..
Felix qui potuit rerum cognoscere causas
ADO c'est un outil d'accès, mais tu peux utiliser n'importe quoi derrière qui fourni un driver ADO ou ODBC ...
sinon, pour le "¶", je ne vois pas pourquoi la TStringList panique, l'affichage dans un Memo, oui c'est sur, faut remplacer le "¶" par #13#10 mais as-tu remplacé TOUS les #13#10 de ton fichier (chargé dans une TStringList, ce n'est pas une méthode que j'apprécie pour la lecture de fichier car elle charge tout en mémoire inutilement) ou juste la partie concernant le Mémo ?
Si tu manipules de gros fichier csv le TStringList est une mauvaise idée.
Grosse conso mémoire et lenteur assurée..mais bon je manipule des fichiers csv de 500 MO aussi..
Gros ou petit, c'est pour ma part, toujours à éviter ... de plus, cela ne permet pas de gérer correctement un fichier CSV contenant des retours charriots dans leur valeur, ce qui arrive typiquement lorsque l'on exporte des données d'une table avec un memo ...Envoyé par Philia
un jour, je me ferais un TCSVReader, ceux trouver sur internet ne gère pas le retour charriot sur un champ et sont souvent d'une lenteur affligeante pour le découpage automatique des champs à base de concaténation de résultat au lieu de calcul d'index avec Copy
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager