IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Ouvrir et lire un fichier .csv


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut Ouvrir et lire un fichier .csv
    Bonjour,

    je voudrais savoir quelles sont les commandes pour ouvrir, lire ligne par ligne, et fermer un fichier excel .csv en delphi. Merci,

    Arthur

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 ?
    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    ok merci je vais chercher un parser sur le net

  4. #4
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    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
    http://www.pocketmt.com GLCD Font Creator home site.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    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.
    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);
    C'est super simple d'utilisation.

    Cordialement
    Qays

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 ...
    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

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Il y a également un bon composant dans la JVCL
    jv Jans CSV
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Citation Envoyé par ShaiLeTroll
    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 ...
    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.

    Après il faudra parser la ligne en récupérant les champs séparé par n'importe quel séparateur.

    faire un
    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;
    C''st quand même plus simpa que le Readln et writeln du vieux Pascal ....

    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
    http://www.pocketmt.com GLCD Font Creator home site.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 ...
    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

  10. #10
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    Citation Envoyé par ShaiLeTroll
    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 !
    http://www.pocketmt.com GLCD Font Creator home site.

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 ...
    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

  12. #12
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    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
    http://www.pocketmt.com GLCD Font Creator home site.

  13. #13
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Retour chariot
    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

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 "¶"
    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

  15. #15
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1

  16. #16
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Retour chariot
    Merci ShaiLeTroll
    je vais tester...

    @bientôt

  17. #17
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut Rc
    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

  18. #18
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    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 ?
    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

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 29
    Points : 26
    Points
    26
    Par défaut
    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..

  20. #20
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Philia
    Si tu manipules de gros fichier csv le TStringList est une mauvaise idée.
    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 ...

    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
    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

Discussions similaires

  1. ouvrir et lire un fichier "csv"
    Par washh dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/12/2008, 15h09
  2. Lire un fichier CSV ou XLS de la même manière
    Par Linio dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/07/2007, 15h12
  3. Ouvrir et modifier plusieurs fichiers .csv.
    Par jackfred dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/07/2007, 12h06
  4. Réponses: 12
    Dernier message: 12/04/2006, 10h20
  5. Lire un fichier CSV/XLS
    Par Doneve dans le forum ASP
    Réponses: 3
    Dernier message: 04/10/2005, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo