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

Autres IDE Pascal Discussion :

Enregistrer un TStringGrid en fichier CSV ou bien XML [CodeTyphon]


Sujet :

Autres IDE Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 92
    Points : 49
    Points
    49
    Par défaut Enregistrer un TStringGrid en fichier CSV ou bien XML
    Bonjour, je souhaiterais enregistrer un TStringGrid en un fichier CSV ou bien XML.
    J'ai essayé un SaveToFile('nom du fichier.csv') : il me donne un fichier texte ordinaire. Pouvez-vous m'aider s'il vous plaît ?

    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
    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
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
      StdCtrls;
     
    type
     
      { TFormMonFormulaire }
     
      TFormMonFormulaire = class(TForm)
        btnSauvegarderXML: TButton;
        btnSauvegarderCSV: TButton;
        Button1: TButton;
        btnFermer: TButton;
        StringGrid1: TStringGrid;
        procedure btnFermerClick(Sender: TObject);
        procedure btnSauvegarderCSVClick(Sender: TObject);
        procedure btnSauvegarderXMLClick(Sender: TObject);
        procedure StringGrid1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      FormMonFormulaire: TFormMonFormulaire;
     
    implementation
     
    {$R *.lfm}
     
    { TFormMonFormulaire }
     
    procedure TFormMonFormulaire.StringGrid1Click(Sender: TObject);
    var i : Integer;
    begin
          With StringGrid1 do
     
           For i:=1 To ColCount-1 do
              Cells[i,0]:='Col '+IntToStr(i);
    end;
     
    procedure TFormMonFormulaire.btnSauvegarderXMLClick(Sender: TObject);
    begin
          StringGrid1.SaveToFile('Grille.XML');
    end;
     
    procedure TFormMonFormulaire.btnFermerClick(Sender: TObject);
    begin
      Close;
    end;
     
    procedure TFormMonFormulaire.btnSauvegarderCSVClick(Sender: TObject);
    begin
     
    end;
     
    end.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Enregistrer est une chose, convertir en est une autre ! Pour le CSV, c'est assez facile : il suffit d'ajouter des virgules, éventuellement des guillemets et peut-être autre chose que j'oublie, mais rien de bien compliqué. Pour le XML, vous serez obligé de passer par une bibliothèque, mais je crois que Lazarus a déjà tout ce qu'il faut. Regardez dans les exemples.

    Mais quel est votre besoin exactement ? Parce CSV ou XML, ce n'est pas la même chose. Et pourriez-vous nous donner un échantillon du texte que vous souhaitez traiter ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Enregistrer est une chose, convertir en est une autre ! Pour le CSV, c'est assez facile : il suffit d'ajouter des virgules, éventuellement des guillemets et peut-être autre chose que j'oublie, mais rien de bien compliqué. Pour le XML, vous serez obligé de passer par une bibliothèque, mais je crois que Lazarus a déjà tout ce qu'il faut. Regardez dans les exemples.

    Mais quel est votre besoin exactement ? Parce CSV ou XML, ce n'est pas la même chose. Et pourriez-vous nous donner un échantillon du texte que vous souhaitez traiter ?
    Merci pour votre réponse,
    Je veux pouvoir enrengistrer en CSV
    et enrengistrer aussi en XML par le biais de deux boutons différent comme mon code le montre
    Je suis sous Typhon.
    Pouvez vous me donner un exemple de code pour l'enrengistrement du CSV et pour l'enrengistrement du XML svp ?

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Pour enregistrer en CSV, il suffit de parcourir la grille ligne par ligne et de séparer les contenus des colonnes par un ';' ou une ',' en écrivant la ligne correspondante du fichier. Il ne devrait pas y avoir de difficulté à le transposer en code fonctionnel.

    Pour le XML, je passe la main, ignorant de ce format !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Bonsoir,

    Pour CSV, il y a beaucoup plus facile que de balayer le contenu de la grille. En effet, la classe TStringGrid est déjà dotée de procédures supportant ce format :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure LoadFromCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true);
    procedure LoadFromCSVFile(AFilename: string; ADelimiter: Char=','; WithHeader: boolean=true);
    procedure SaveToCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true; VisibleColumnsOnly: boolean=false);
    procedure SaveToCSVFile(AFileName: string; ADelimiter: Char=','; WithHeader: boolean=true; VisibleColumnsOnly: boolean=false);
    Ces procédures sont définies dans l'ancêtre TCustomStringGrid et sont publiques : elles sont par conséquent héritées par TStringGrind et utilisables directement. A priori, ce sont celles contenant File qui sont les plus évidentes.

    Pour XML, il faut faire appel à des unités supplémentaires dont laz2_DOM. Mais le travail est plus complexe

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par gvasseur58 Voir le message
    Bonsoir,

    Pour CSV, il y a beaucoup plus facile que de balayer le contenu de la grille. En effet, la classe TStringGrid est déjà dotée de procédures supportant ce format :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure LoadFromCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true);
    procedure LoadFromCSVFile(AFilename: string; ADelimiter: Char=','; WithHeader: boolean=true);
    procedure SaveToCSVStream(AStream: TStream; ADelimiter: Char=','; WithHeader: boolean=true; VisibleColumnsOnly: boolean=false);
    procedure SaveToCSVFile(AFileName: string; ADelimiter: Char=','; WithHeader: boolean=true; VisibleColumnsOnly: boolean=false);
    Ces procédures sont définies dans l'ancêtre TCustomStringGrid et sont publiques : elles sont par conséquent héritées par TStringGrind et utilisables directement. A priori, ce sont celles contenant File qui sont les plus évidentes.

    Pour XML, il faut faire appel à des unités supplémentaires dont laz2_DOM. Mais le travail est plus complexe

    Gilles
    Merci Beaucoup de votre aide.
    Je suis débutant et je n'y connais rien

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Voici, pour vous mettre le pied à l'étrier, un exemple tout simple basé sur la proposition de Gilles.

    C'est un tableau de "contacts" (nom, prénom, adresse, téléphone). Vous pouvez sauvegardez le tableau dans un fichier et le recharger depuis le fichier. Voici le contenu de mon fichier. Vous remarquerez que le programme a automatiquement ajouté des guillemets aux chaînes contenant des espaces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Nom,Prénom,Rue,"Code postal",Ville,Téléphone,Mail
    Pascal,Blaise,,,Clermont-Ferrand,,
    ,,,,,,
    ,,,,,,
    ,,,,,,
    ,,,,,,
    ,,,,,,
    ,,,,,,
    ,,,,,,
    ,,,,,,
    Questions aux experts de Lazarus : depuis quelque temps (depuis que j'ai installé la version 1.4 ?), Lazarus place mes exécutables dans le dossier lib. C'est un nouveau réglage par défaut ou c'est moi qui ai changé une option sans m'en apercevoir ? Comment faut-il renseigner l'option "Nom du fichier cible", mis à part mettre un nom en toutes lettres ?
    Fichiers attachés Fichiers attachés
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Questions aux experts de Lazarus : depuis quelque temps (depuis que j'ai installé la version 1.4 ?), Lazarus place mes exécutables dans le dossier lib. C'est un nouveau réglage par défaut ou c'est moi qui ai changé une option sans m'en apercevoir ? Comment faut-il renseigner l'option "Nom du fichier cible", mis à part mettre un nom en toutes lettres ?
    Bonjour Roland,

    Sans prétendre être un expert de Lazarus, je crois que tu risques d'avoir modifié tes options de compilation. Voici celles par défaut :

    Nom : Capture.PNG
Affichages : 405
Taille : 30,5 Ko

    Dans lib, Lazarus place les unités compilées et non les exécutables.

    Pour ce qui est le nom du fichier cible, il n'est en général pas nécessaire ni souhaitable de le modifier : le programme prend automatiquement le nom du projet et ce n'est que dans le cas où tu souhaites un autre nom que tu le modifieras. Mais autant faire un changement depuis l'OS, non ?

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bonjour Gilles ! Merci pour ta réponse, qui m'a permis de résoudre le problème. J'ai remis manuellement "project1" comme nom de fichier cible (le champ était vide), coché "Définir comme options par défaut" et de nouveau les exécutables sont créés dans le répertoire du projet (et le nom du fichier cible se met bien à jour tout seul).
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  10. #10
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Salut

    Pour le XML, il faut peut-être utiliser une bibliothèque spécifique mais il faut définir avant tout la structure de ton fichier (définir les balises si tu préfères).
    Les possibilités sont si étendues qu'il est sans doute vain de proposer une routine de manière standard dans la FCL.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    Bonjour, je suis de retour, je voudrai savoir comment charger un fichier CSV dans mon programme avec le "LoadFile" s'il vous plaît ensuite comment sauvegarder mes données du tableau dans un fichier XML s'il vous plaît. Je vous transmet donc mon fichier avancé. Activité 2.rar
    Merci de votre aide précieuse

  12. #12
    Membre averti

    Homme Profil pro
    Diverses
    Inscrit en
    Février 2014
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Diverses

    Informations forums :
    Inscription : Février 2014
    Messages : 122
    Points : 428
    Points
    428
    Par défaut
    Normalement une TStringGrid peut sauver sont contenu en XML par SaveToFile ou SaveToStream et on peut choisir ce que l'on veut sauver par la propriété SaveOptions. Je viens de faire un test rapide et ça a l'air de marcher. J'obtiens bien du XML que je peux ensuite recharger dans la grille par LoadFromFile ou LoadFromStream.

  13. #13
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par LerikalBless Voir le message
    Bonjour, je suis de retour, je voudrai savoir comment charger un fichier CSV dans mon programme avec le "LoadFile" s'il vous plaît ensuite comment sauvegarder mes données du tableau dans un fichier XML s'il vous plaît. Je vous transmet donc mon fichier avancé. Activité 2.rar
    Merci de votre aide précieuse
    Bonjour,
    Pour le chargement, je rappelle la méthode de TStringGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure LoadFromCSVFile(AFilename: string; ADelimiter: Char=','; WithHeader: boolean=true);
    Seul le premier paramètre est vraiment nécessaire puisque les autres sont fournis par défaut :
    * place une TStringGrid sur la fiche
    * place un bouton
    * dans l'événement OnCLick du bouton, écris quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      StringGrid1.LoadFromCSVFile('NomDeMonFichier.csv');
    end;
    ... et la grille est remplie

    Pour XML, voir Yamer.

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2015
    Messages : 92
    Points : 49
    Points
    49
    Par défaut
    Merci de votre aide vous êtes génial !
    Problème RESOLU

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enregistrer un QGraphicView en fichier *.CSV
    Par skyze dans le forum Débuter
    Réponses: 4
    Dernier message: 21/03/2014, 13h04
  2. [MySQL] Enregistrer un fichier .csv obtenu d'un appel SQL
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/01/2007, 18h55
  3. Enregistrer un fichier ".CSV" en ".XLS"
    Par Isa31 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 13/03/2006, 14h05
  4. Réponses: 12
    Dernier message: 27/01/2006, 11h07
  5. [CSV] Enregistrer sous? Apres un fichier enregistré
    Par Anakior dans le forum Langage
    Réponses: 12
    Dernier message: 19/12/2005, 13h30

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