Gestion de chaines alphanumériques (equivalent a un champ VARCHAR)

Signaler
Messages postés
6
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
6 août 2004
-
Messages postés
6
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
6 août 2004
-
bonjour,

je dois traiter un fichier texte de type CSV (sauf que les séparateurs sont pas des ; mais juste des tabulations) dans lequel se trouvent des champs ou on trouve a la fois des entiers et des caractères (par exemple des adresses, genre "6 rue truc")

or je ne sais pas quel type de variable utiliser pour récuperer la valeur de chaines comme ca

j'attends vos idées avec impatience, merci d'avance

7 réponses

Messages postés
6
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
6 août 2004

ET BIEN SUR J'AI OUBLIE LE PLUS IMPORTANT:

je dois faire ca en C ou C++ :)

qu'est ce qu'on peut etre distrait quand on est désésperé...
Messages postés
48
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
26 juillet 2005
3
Salut est ce qu' un sscanf() suffirait ?

Exemple :

char donnee_lue[256]; // une ligne de ton fichier CSV
char nom[25];
char prenom[25];
char adresse [50];

sscanf(donnee_lue,"%s\t%s\t%s\t",nom, prenom, adresse);

où %s demande la lecture d'une chaine, \t est le code de la tabulation
Messages postés
231
Date d'inscription
mercredi 12 février 2003
Statut
Membre
Dernière intervention
7 juillet 2009

Ma fonction gettok devrait être utile dans ce cas là.

Sinon tu peux 'spliter' ta chaîne 'ligne' en plusieurs sous-chaînes.
char *c, *d;c d ligne; /*ligne: une des ligne de ton fichier*/
while (*c) {
while (*c != 9 && *c) c++;
if (*c == 9) {
*c = 0;
printf("chaine: %s\n",d); //d represente la sous-chaine actuelle
d = ++c;
}
else {
printf("chaine: %s\n",d); //d represente la dernière sous-chaine
break; //nous évite une vérification de *c inutile
}
}
Messages postés
6
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
6 août 2004

J'ai réussi a bidouiller un truc avec fgets qui marche partiellement, maintenant j'ai un probleme de comptage.

pour que vous compreniez un peu plus prenons un exemple (en gros, le fichier sur lequel je fais mes tests a la con)

j'ai un fichier texte qui contient :

blah bleh bloh truc 5 truc blah

ce que je veux c'est récupérer "truc 5 truc".

je sais que cette chaine se trouve entre la 3eme et la 4eme tabulation.

j'ai les variables suivantes:

int main(void)
{
FILE *file;
char Buffer;
//char ptrMot;
char motVC[15];
int nbTab=0;


ce que je fais, c'est que je compte d'abord le nombre de tabulations:
---------------------------------------------
while (nbTab<3)
{
fread(&Buffer, 1, 1, file); //on range les caractere dans le buffer
if (Buffer=='\t') nbTab++;
---------------------------------------------------

ensuite, je calcule la taille du champ que je veux en comptant le nb de caractères jusqu'a la prochaine tabulation:

--------------------------
i=0;
fread(&Buffer, 1, 1, file);
while (Buffer!='\t') {i++;}
----------------------------

Enfin, j'extrait la chaine de longueur i et je la range la ou je veux:

-----------------------------
fgets(motVC,i,file);
-----------------------------

seulement voila, le programme ne s'arrete pas a la 4eme tabulation, donc je me retrouve avec motVC qui contient "truc 5 truc blah"

et n'etant pas le plus fortiche en C, j'arrive pas a trouver pq il s'arrete pas de compter après la 4eme tabulation pour calculer la longueur du champ/

une idée? :question)
Messages postés
6
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
6 août 2004

REMARQUE: ca se voit pas sur le forum, mais ce sont des tabulations, sauf dans "truc 5 truc"
Messages postés
6
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
6 août 2004

:blush) :blush) :blush) :blush) :blush) :blush)

bon alors j'ai meme pas mis la bonne version de mon code.

un ptit instant je reviens avec la bonne.
Messages postés
6
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
6 août 2004

voila le code complet en question et en entier pour que vous compreniez mieux, j'ai parfois du mal a etre clair

-----------------------------------------------------------------
#include <stdio.h>
#include <string.h>

char file_t[150];

//Fonction de spécification du fichier

int file_c()
{
printf(">emplacement du fichier:");
gets(file_t);
fflush(stdin);
return 0;
}

//fonction principale
int main(void)
{
FILE *file;
char Buffer;
char ptrMot;
char motVC[15];
int nbTab=0;
int i;

file_c();

if((file = fopen(file_t, "r")) != NULL)
{

while (!feof(file))
{


while (nbTab<3)
{
fread(&Buffer, 1, 1, file);

if (Buffer=='\t') nbTab++;
}


//on compte le nb de caractères du champ (le champ s'arrete a la tabulation suivante)


while (Buffer!='\t')
{
i=0;
fread(&Buffer, 1, 1, file);
i++;
}


fgets(motVC,i,file);

//on affiche le champ qu'on viens de récupérer

printf("%s",motVC);

}
}
fclose(file);
getch();
}

-----------------------------------------------------------------------

voila.

si vous voulez test aussi, faite un fichier texte avec la ligne

bla[tab]bla[tab]bla[tab]truc 5 truc[tab]bla

[tab]= touche tabulation (sur le forum ca fait un espace, donc je précise l'emplacement des tab)

merciiii merciiiii pour vos idées que vous allez me donner