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

Langage Delphi Discussion :

lire 3 string séparés par virgule dans fichier sequentiel


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut lire 3 string séparés par virgule dans fichier sequentiel
    Bonjour,

    Je souhaite lire un fichier de type CSV qui contient :
    Toto,Tata,Tutu

    Le séparateur de champs est la virgule
    La fin de ligne est un CR+LF
    il n'y a qu'un seul enregistrement

    Je sais que c'est un truc trés basique qui se fait en 1 ligne en VB, mais en delphi je ne trouve pas...
    ...cette question a du être posée 3000 fois, mais je cherche depuis 2 jours et je n'ai toujours rien trouvé...

    merci de votre aide et de votre indulgence.

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Lire un fichier c'est trés simple, mais c'est pour en faire quoi ?
    Car, il y a pas mal de possibilité pour lire un fichier.

    soit un peu plus précis dans ta demande

    Sinon tu peux utiliser sur TFileStream, TStringList, etc...

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    je veut juste récupérér 3 paramètres qui me sont passés dans ce fichiers.
    Il s'agit de 3 noms de fichiers.

    Il me faudrait un exemple SVP car je suis tres tres debutant...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Dans le cas le plus simple.

    charger votre fichier Csv dans un TStringList;
    La propriété text de la list contient le fichier.
    remplacer les ',' par des CRLF.
    vous pouvez parcourire la liste pour avoir chaque cellule.
    Recommencer pour chaque ligne.

    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
     
    var
      Toto: TStringList;
    i: Integer;
    begin
     
      toto := TStringList.create;
      toto.text := 'toto, titi,tutu';
       toto.text := AnsiReplaceStr(Toto.text, ',', #13#10);
    // toto.text contient 'tata#13#10titi#13#10tutu'
     
      for i := 0 to toto.Icount - 1 do
         ShowMessage(toto[i]);
      end;
      toto.free;
    end;
    Attention, ne créer le tstringlist que la premiere fois.
    Pour les autres ligne, utiliser le TStringlist déja créer.
    N'oublier pas de détruire le tstringlist en fin de traitement.
    Je n'ai pas mieu qu'un traitement ligne par ligne.
    Vous pouvez utilis un TTextFile pour lire le fichier ligne a ligne.

  5. #5
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    merci pour ta réponse, mais n'existe t'il pas une soluce + simple ?

    en VB par exemple, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FileOpen(1, FileTemp, OpenMode.Input)
    Input(1, Param1)
    Input(1, Param2)
    Input(1, Param3)
    FileClose(1)
    1 ligne pour ouvrir, 1 pour lire, 1 pour fermer.
    En delphi ça peut pas être aussi compliqué ?!
    [Modération]
    Merci d'utiliser les balises code ou quote,Laurent Dardenne
    [/Modération]

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Je ne connais pas VB mais il me semble que le principe est le même

    Ouvrire le fichier

    Lire la 1° ligne et la traiter(FileModele)
    Lire la 2° ligne et la traiter(FileImport)
    Lire la 3° ligne et la traiter(RefEts)

    Fermer le fichier

    Le traitement que j'ai donner traite une ligne pour avoir aces a chaque cellule d'une ligne. c'est le plus compliqué.

    Pour lire le fichier utiliser les TextFile (voir l'extrait de l'aide Delphi si dessous).
    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
     
    var
     
    F:TextFile;
    S:string;
    begin
    if OpenDialog1.Executethen           {Affichage de la boîte de dialogue d'ouverture }
    begin
    AssignFile(F,OpenDialog1.FileName);{Fichier sélectionnédans la boîte de dialogue }
    Reset(F);
    Readln(F,S);{Lecture de la première ligne du fichier }
    Edit1.Text :=S;{Introduction de la chaîne dans un contrôle TEdit }
    CloseFile(F);
     
    end;
    end;

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    ce ne sont pas 3 lignes, mais 3 champs séparés par une virgule que je veut récuperer dans 3 variables...
    dans ton code je suis obligé de rechercher les virgules et découper moi-même...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    C'est don un fichier Csv qui ne contient q'une ligne.C'est un cas particulier simplidié) de n lignes.
    Dans ce cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      toto: TStringList;
    begin
    toto := TStringList.create;
    toto.loadFromfile(Nom_du_fichier);
    toto.text := AnsiReplaceStr(Toto.text, ',', #13#10);
    ....
    Utilisation de chaque cellule
      toto[0] contient la 1° cellule
      toto[1] contient la 2° cellule
    etc..
    ....
    toto.free;
    De toutes manière si vous lisez un fichier, vous devez le lire en mode générale (x octets par x octets puis traitement des paquet pour recuperer l'information), ou sous un format particulier (text = ligne par ligne avec chaque ligne separe par un CRLF soir #13#10). Le format Csv n'existe pas de manière native et il n'existe pas , a mas conaissance, de format permettant de lire un fichier en changeant le caratère de fin de ligne (, au lieu de CRLF). Vous devez donc implementer vous même un traitement.

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Tu trouveras des fonctions toutes faites et tout à fait appropriées à ton problème dans les objets Tstrings et TstringList :
    Propriétés Commatext ou DelimitedText.

  10. #10
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    l'aide confirme que c'est bien la solution mais je n'y trouve pas d'exemple concret et ça dépasse un peu mes compétences...un petit exemple serait le bienvenu...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Je m'excuse, je crois que j'ai raconter des bétise en disant que les fonctions n'existait pas.

    J'utilise toujour la même mêtode (par emplacement) depuis Delphi1 et il semble que j'ai raté quelque chose depuis pas mal de temps.

  12. #12
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    j'y suis arrivé en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     AssignFile(MyFic, FileTemp);
               reset(MyFic);
               Read(Myfic, Ligne);
               TmpParam:= TStringList.Create;
               TmpParam.CommaText:=Ligne;
     
               Param1:=TmpParam[0];
               Param2:=TmpParam[1];
               Param3:=TmpParam[2];
    ...mais j'ai parfois des espaces dans certains paramètres et il me tronque la chaine, alors que je voudrais qu'il ne prenne que la virgule comme séparateur...existe t'il une soluce ?

  13. #13
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Je me damande si ne pas mettre un fichier par ligne ne te faciliterais pas un peu la tache.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      toto: TStringList;
    begin
    toto := TStringList.create;
    toto.loadFromfile(Nom_du_fichier);
     
    ....
    Utilisation de chaque cellule
      toto[0] contient la 1° cellule
      toto[1] contient la 2° cellule
    En même temps, ça ne gagne pas grand chose sur la méthode de Tardiff Jean-François.

  14. #14
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Effectivement, en utilisant commatext il y a un "trim" (suppression des blancs de début et de fin des éléments.

    Si on veut les conserver, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const SpecialString = '$_$' ; // chaine impossible à trouver  
    ...
    TmpParam.CommaText:=AnsiReplaceStr(Ligne,' ',SpecialString)  ;
    ...
    Param1:=AnsiReplaceStr(TmpParam[0],SpecialString,' ') ;

  15. #15
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2002
    Messages : 264
    Points : 175
    Points
    175
    Par défaut
    merci beaucoup pour votre aide...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/07/2009, 09h37
  2. [MySQL] Alimenter un tableau par des string séparés par point virgule
    Par Zikas-r dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/04/2009, 11h19
  3. Réponses: 3
    Dernier message: 12/08/2008, 13h26
  4. Lire une string ligne par ligne
    Par Aurazed dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 08/02/2008, 11h24
  5. lire le point-virgule dans un fichier .ini
    Par juflata dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 05/07/2004, 12h46

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