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

Rechercher texte dans un document CSV


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Rechercher texte dans un document CSV
    Bonjour ,

    je dois faire un programme cherchant une ligne de caractere dans un fichier CSV ( un Code Postal en l'occurence)

    j'ai fait ceci pour lire et afficher mon CSV

    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
    include <stdio.h>
    include <stdlib.h>
    int main(int argc, char *argv[])
    {
    FILE* fichier = NULL;
     
    char ville[20];
    int codePostal, id, codeEntree;
     
    fichier = fopen("cities.csv", "r");
     
    if (fichier != NULL)
    {
     
    do
    {
    fscanf(fichier, "%d,\"%d\",\"%s\"\n", &id, &codePostal, ville);
     
    if (codePostal == codeEntree)
    {
     
    printf("%d %s", codePostal, ville);  
    break;
    };
     
    }
    while (!feof(fichier));
     
    fclose(fichier);
    }
     
    return 0;
    }
    mon but est de rechercher une ligne precise et l'afficher la dificultée etant la syntaxe du fichier :

    1,"9420","Aaigem"
    2,"8511","Aalbeke"
    3,"9300","Aalst"
    4,"3800","Aalst (Limb.)"
    5,"9880","Aalter"
    6,"3200","Aarschot"
    7,"8700","Aarsele"
    8,"8211","Aartrijke"
    9,"2630","Aartselaar"
    10,"4557","Abée"
    11,"4280","Abolens"
    12,"3930","Achel"

    je dois par exemple taper 3930 et la console devra afficher la ville + l'id mais je sais pas comment faire quand j'execute j'ai une flopée de caractère asci random je pense que ca vient du fait que mon fichier csv est en une seule ligne (screen) Nom : 2016-06-09 12_39_13-cities - Excel.png
Affichages : 290
Taille : 143,9 Ko


    merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Dans le principe de votre fscanf (dont il serait judicieux de regarder la valeur retournée), je suggère de rajouter un guillemet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fichier, "\"%d,\"%d\",\"%s\"\n", &id, &codePostal, ville);
    Sinon, je n'aimerai pas qu'une ville ait un nom de plus de 20 caractères
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut
    Bonjour agsbiner,

    Les valeurs random viennent plutôt du fait que les variables (codePostal, id et ville) ne sont pas initialisées. Lors de leurs affichage ce sont leurs valeurs par défaut qui sont affichées et non qql chose venant du csv.

    Je pense que le fait que tu as toutes les informations en une cellule, t'obligeras de récupérer une seule entrée. Et après il faut voir comment dévélopper une fonction qui va te permettre de faire un split sur cette chaîne en spécifiant un séparateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
             int ret = fscanf(fichier, "%s \n",Infos);
     
             if (ret == 1)
             {
                  printf("Ma ligne: %s\n",Infos);
                  /*Ici faire un traitement sur la chaine pour en extraire les données désirées.*/
             }
    Bon courage!

  4. #4
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut,

    Si on par du principe que ton fichier CSV est formaté par ; et \n, tu peux très bien faire une fonction qui enregistre dans un tableau à 2 dimensions pour string donc un char*** le contenu de ton fichier csv.

    Effectivement, utiliser %s pour afficher un string sans s'assurer que cette string se termine bien par le caractère de control de fin de chaine \0 et la meilleure façon d'obtenir le résultat que tu décris à savoir des caractères aléatoires après le résultat escompté.

    Aussi, si ton fichier csv contient des caractères non ASCII, ils seront affichés différement dans la console DOS qui utilises l'encodage cp850 alors que dans ton fichier CSV, windows utilise à priori l'encodage cp1252. Mais c'est une autre histoire. Et bien que ces encodages utilisent le code ASCII en partie, en ce qui concerne les codes ASCII étendue respectifs, les tables sont différentes.

    J'ai eu les mêmes besoins auparavant, j'ai donc écris une petite bibliothèque de fonctions qui me permettent de faire ce dont tu as besoin.
    En l'état, elle est inexploitable car il faudrait le reste de mes headers mais tu peux lire les fonctions pour comprendre ce qu'elles font.
    Si tu le souhaites, je peux te passer le code complet. L'idéal serait si tel est le cas, que tu t'appropries le code en le réécrivant à ta manière et en l'améliorant.

    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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    t_3Dc *csv_format( t_csv *p )
    {
        t_3Dc *p_out = NULL;
        if ( p ) ///T0
        {
            if ( p->raw->da ) ///T1
            {
                if ( (p_out = create_3D_c(p->line, p->row, 1000)) ) ///T2
                {
                    t_uint64 i, i_tmp, line, row;
                    i_tmp = 0;
                    line  = 0;
                    row   = 0;
                    for( i=0 ; i < p->raw->x ; i++ )
                    {
                        if ( p->raw->da[i] == ';' )
                            i_tmp = 0, row++;
     
                        else if ( (p->raw->da[i] == '\n') )
                            i_tmp = 0, line++, row = 0;
     
                        else
                        {
                            if ( line >= p->line || row >= p->row || i_tmp >= 1000 )
                                printf("\n Possible SIGSEV signal while translating data to the 3D array\n max_line = %I64u ; current is %I64u\n max_row = %I64u ; current is %I64u\n i_tmp_max = %I64u ; current is %I64u", p->line , line+1, p->row, row+1, (t_uint64)1000 , i_tmp );
     
                            else
                            {
                                if (p->raw->da[i] != '\r')
                                    p_out->da[line][row][i_tmp] = p->raw->da[i], i_tmp++;
                            }
                        }
                    }
                }
                else fprintf(logger, "csv.h::csv_format.T2 -> The memory allocation of the csv array's pointer is NULL\n");
            }
            else fprintf(logger, "csv.h::csv_format.T1 -> The raw csv file's pointer is NULL\n");
        }
        else fprintf(logger, "csv.h::csv_format.T0 -> The t_csv structure's pointer is NULL\n");
        return p_out;
    }
     
     
     
    t_uint64 csv_get_line( t_csv *p )
    {
        t_uint64 line = 0;
        if( p ) ///T1
        {
            if ( p->raw->da ) ///T2
                line = str_count_occurrence( p->raw->da, '\n' );
     
            else fprintf(logger, "csv.h::csv_get_line.T2 -> The char's pointer is NULL\n");
        }
        else fprintf(logger, "csv.h::csv_get_line.T1 -> The t_csv structure's pointer is NULL\n");
        return line;
    }
     
    t_uint64 csv_get_row( t_csv *p )
    {
        t_uint64 max = 0;
        t_uint64 row = 0;
        if( p )
        {
            if ( p->raw )
            {
                t_uint64 i;
                for ( i=0 ; i<p->raw->x ; i++ )
                {
                    if ( p->raw->da[i] == '\n' )
                    {
                        if (row>max)
                            max=row;
     
                        row = 0;
                    }
     
                    if ( p->raw->da[i] == ';' )
                        row+=1;
                }
            }
            else fprintf(logger, "csv.h::csv_get_row -> da t_2Dc structure's member is NULL\n");
        }
        else fprintf(logger, "csv.h::csv_get_row -> t_csv structure is NULL\n");
        return max+1;
    }
     
    void csv_display(t_csv *p)
    {
        if(p)
        {
            t_uint64 i,j;
            for(i=0;i<p->line;i++)
            {
                for(j=0;j<p->row;j++)
                    printf("%s ",p->array->da[i][j]);
     
                printf("\n");
            }
     
        }
    }
     
    void csv_to_file( t_csv *p )
    {
        if (p)
        {
            FILE *f = NULL;
            if ( f=file_open(p->path,"w") )
            {
                t_uint64 i,j;
                for(i=0; i<p->line ; i++)
                {
                    for(j=0 ; j<p->row ;j++ )
                    {
                        fprintf(f,"%s;",p->array->da[i][j]);
                    }
                    fprintf(f,"\n");
                }
                file_close(f);
            }
        }
    }
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/10/2015, 21h08
  2. Recherche texte dans une page ?
    Par Kenshin86 dans le forum IE
    Réponses: 6
    Dernier message: 29/04/2007, 00h55
  3. Affichage d'un texte dans un document.
    Par Luffy49 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/03/2007, 19h32
  4. [win32] Recherche texte dans fichier
    Par raphael_kindt dans le forum Windows
    Réponses: 1
    Dernier message: 26/07/2006, 12h51
  5. Recherche texte dans txt
    Par Guillaume602 dans le forum Windows
    Réponses: 3
    Dernier message: 21/12/2005, 00h05

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