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

C++Builder Discussion :

Lire dans un fichier .txt avec separateur


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 23
    Points : 22
    Points
    22
    Par défaut Lire dans un fichier .txt avec separateur
    Bonjour,

    Je pense que des messages avec des demandes de lecture de fichier texte il y en a eut des milliers, j'ai passé des heures à chercher et sans succès, c'est pour cela que je vous expose mon problème. C'est une fonction recherche que j'essaie de réaliser.

    J'ai un fichier texte avec plusieurs lignes contenant toujours des infos sous la forme

    Nom;Prenom;Telephone;Adresse;Ville;Code postal;Mail.

    J'aimerai un code permettant de lire ligne par ligne et de récupérer chaque variable de la ligne séparer par le délimiteur ";"
    Il y a la fonction explode sous PHP que je connais, mais malheureusement pas utilisable en C++

    L'utilisateur rentre dans un edit le mot : Nom
    Le programme doit chercher dans le fichier texte ligne par ligne où apparait le champ Nom et me ressortir toute la ligne sans les séparateurs dans un Memo.

    Ca c'est pour la fonctionnalité globale, j'aimerai déjà rechercher dans ce fichier texte et récupérer les variables délimiter par un ";" donc.

    Est ce possible ou dois je m'y prendre autrement?

    Sachant que je dos travailler absolument avec un fichier texte.

    Merci par avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    Une piste pour l'équivalence avec ton explode, utilisant la librairie SysTools:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <ststrl.hpp>
     
    TStringList *ptl_tokens = new TStringList;
     
    ExtractTokensS(chaine_source, ";", '"', true, ptl_tokens);

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Pour l'extraction tu peux utiliser Pos et SubString (voir l'aide pour AnsiString et ses méthodes).
    Pour résumer :
    - on cherche dans la chaîne la position d'un séparateur (le premier détécté est le bon)
    - on extrait de la chaîne la partie en amont (comme un LEFT$)
    - la chaîne devient ensuite la partie en aval (comme un RIGHT$)
    - on continue (de RIGHT$ en RIGHT$) jusqu'à épuisement

    Voici comment ça s'implémente :

    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
     
    // REM : AnsiString Sep = ";";
    // REM : AnsiString N contient la chaîne
     
    int p;
    p= N.Pos(Sep); // << position du séparateur
    if(p != 0) // tester s'il existe
        {
        Nom = N.SubString(1, p-1); // << sous chaîne de début
        N = N.SubString(p+1, N.Length()); // nouvelle chaîne (ce qui reste à traiter)
     
        //...prêt pour extraire Prenom
        p = N.Pos(Sep)
        if(p != 0)
            {
            Prenom = ...
            //...
     
                //...   
                        // et à la fin :
                        p = N.Pos(Sep);
                        if(p != 0)
                            {
                            Code_postal = N.SubString(1, p-1);
                            Mail = N.SubString(p+1, N.Length());
                            }
    // ...
    Il serait peut-être intéressant de modéliser une fiche et de quoi gérer l'ensemble des fiches.

    A plus !

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    ou bien ceci:

    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
     
    TStringList *Tocken=new TStringList;
    Tocken->Clear();
     
    Memo->Clear();    /// a ajouter sur ta forme
    Memo->Lines->LoadFromFile("blabla.txt");
     
    int i=0;
    while(i < Memo->Lines-> Count){
    String line=Memo->Lines->Strings[i];
    Tocken->Clear();
    Tocken->Text=StringReplace(line,';',"\n",TRepcalceFlags()<<rfReplaceAl);
    if(Tocken->Count==0){ShowMessage("no tocken");return ;} // attention au return selon ta fonction
     
    // si non ta tes tockens de ta ligne tu pe les parcourire
    for(int j=0;j<Tocken->Count;j++){
    string mot=Tockent->Strings[j];
    //comraison--------
    }
     
     
     
     
    }
    « Aucun homme ne peut rien vous révéler sinon ce qui repose déjà à demi endormi dans l'aube de votre connaissance»

    « No man can reveal to you aught but that which already lies half asleep in the dawning of your knowledge »_(¯`·.__-Alg3ri4nH4ck3r-__.·´¯)_

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Merci pour toutes vos réponses, mais c'est un peu trop évolué pour moi, je pense prendre la solution de Henderson

    Ta solution me plait bien, ca donne donc quelque chose de ce genre?

    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
     
    ifstream fichier("user.dat", ios::in);  // on ouvre en lecture
     
            if(fichier)  // si l'ouverture a fonctionné
    		{
    				AnsiString Nom, Prenom, Tel, Adresse , Ville, CP, Mail;
    				AnsiString Sep = ";";
    				AnsiString ligne;  // déclaration d'une chaîne qui contiendra la ligne lue
    				getline(fichier, ligne);  // on met dans "contenu" la ligne
    				int p;
    				p = ligne.Pos(Sep);
    				if( p != 0)
    				{
    					Nom = ligne.SubString(1, p-1);
    					Prenom = ligne.SubString(p+1,ligne.Length());
    					p = ligne.Pos(Sep);
    					if( p != 0)
    					{
    						Prenom = ligne.SubString(1, p-1);
    						Tel = ligne.SubString(p+1,ligne.Length());
    					}
    						//etc....
    							p = ligne.Pos(Sep);
    							if(p != 0)
    							{
    								CP = ligne.SubString(1, p-1);
    								Mail = ligne.SubString(p+1, ligne.Length());
    							}
     
    				}
    				fichier.close();
    		}

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Oui ... sauf que je n'ai fait que montrer l'extraction à l'aide de Pos et SubString (dans un contexte de fiches ...).
    Il y a beaucoup plus simple si on travaille sur un TStringGrid (et on devine très vite pourquoi...)
    Je suppose que ce TStringGrid affiche 1 ligne et 1 colonne de cellules grisées.
    Voici comment se présente l'extraction et le remplissage de cette StringGrid, à l'ouverture d'un fichier :

    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
     
    void __fastcall TForm1::Ouvrir1Click(TObject *Sender)
    {
    int j, row;
    TReplaceFlags Flags = Flags << rfReplaceAll;
    // je me suis limité à faire ça, donc à toi de rajouter ce qui manque :
    AnsiString T0 = " \n";
    AnsiString T1 = "Nom\n";
    AnsiString T2 = "Prenom\n";
    AnsiString T3 = "Adresse\n";
    AnsiString T4 = "Ville\n";
    //...
    AnsiString N = T0 + T1 + T2 + T3 + T4;
     
    if(OpenDialog1->Execute())
        {
        TStringList *Fichier = new TStringList;
        Fichier->LoadFromFile(OpenDialog1->FileName);
        StringGrid1->RowCount = Fichier->Count + 1; // + 1 ligne grisée
        // titres des colonnes
        StringGrid1->Rows[0]->Text = N;
     
        for(j = 0; j < Fichier->Count; j++)
            {
            row = j+1;
            StringGrid1->Rows[row]->Text = IntToStr(row) + "\n" +
                                           StringReplace(Fichier->Strings[j], ";", "\n", Flags);
            }
        Fichier->Clear();
        delete Fichier;
        }
    }
    Si cette StringGrid est invisible, dans ce cas on n'a pas besoin des cellules grisées, donc en tenir compte au niveau du calcul des lignes et colonnes.
    C'est donc une manière simple d'organiser et de représenter cette extraction.

    Note que si on veut centrer le texte dans les cellules grisées, il faudra utiliser OnDrawCell ... mais on y est pas encore !

    A plus !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 23
    Points : 22
    Points
    22
    Par défaut
    Merci tout le monde, c'est nikel, j'ai réussit à faire mon champ recherche grâce à votre aide!

    Voilà, le code :

    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
    int j, row;
    		TReplaceFlags Flags = Flags << rfReplaceAll;
    		AnsiString T0 = " \n";
    		AnsiString T1 = "Nom\n";
    		AnsiString T2 = "Prenom\n";
    		AnsiString T3 = "Tel\n";
    		AnsiString T4 = "Adresse\n";
    		AnsiString T5 = "Ville\n";
    		AnsiString T6 = "CP\n";
    		AnsiString T7 = "Digicode\n";
    		AnsiString T8 = "Mail\n";
     
    		AnsiString N = T0 + T1 + T2 + T3 + T4 + T5 + T6 + T7 + T8;
     
    		if(OpenDialog1->Execute())
    		{
    			TStringList *Fichier = new TStringList;
    			Fichier->LoadFromFile(OpenDialog1->FileName);
    			StringGrid1->RowCount = Fichier->Count +1; // + 1 ligne grisée
     
    			// titres des colonnes
    			StringGrid1->Rows[0]->Text = N;
    			for(j = 0; j < Fichier->Count; j++)
    			{
    				row = j+1;
    				StringGrid1->Rows[row]->Text = IntToStr(row) + "\n" +
    									   StringReplace(Fichier->Strings[j], ";", "\n", Flags);
    				if(Edit2->Text==StringGrid1->Cells[1][row])
    				{
    					Form2->Memo1->Lines->Add(StringGrid1->Rows[row]->Text);
    				}
    				else if(Edit2->Text==StringGrid1->Cells[3][row])
    				{
    					Form2->Memo1->Lines->Add(StringGrid1->Rows[row]->Text);
    				}
    			}
    			Fichier->Clear();
    			delete Fichier;
     
    		}
    Un grand merci encore

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

Discussions similaires

  1. Lire dans un fichier .txt
    Par donutsk8r dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/09/2009, 08h46
  2. Ecriture dans un fichier txt avec C++
    Par altera14 dans le forum C++
    Réponses: 4
    Dernier message: 17/06/2008, 10h57
  3. comment ecrire dans un fichier txt avec WriteFile?
    Par Art19 dans le forum Langage
    Réponses: 13
    Dernier message: 04/07/2007, 15h50
  4. Lire DANS un fichier wav avec VBA
    Par SwissEngineer dans le forum Général VBA
    Réponses: 7
    Dernier message: 01/12/2006, 16h56
  5. lire dans un fichier .txt
    Par Baptiste Wicht dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 17/12/2005, 18h31

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