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

xuenylom Messages postés 6 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 6 août 2004 - 6 août 2004 à 11:28
xuenylom Messages postés 6 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 6 août 2004 - 6 août 2004 à 14:55
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

xuenylom Messages postés 6 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 6 août 2004
6 août 2004 à 11:29
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é...
0
essirc Messages postés 48 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 26 juillet 2005 3
6 août 2004 à 11:38
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
0
Hades53 Messages postés 231 Date d'inscription mercredi 12 février 2003 Statut Membre Dernière intervention 7 juillet 2009
6 août 2004 à 13:56
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
}
}
0
xuenylom Messages postés 6 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 6 août 2004
6 août 2004 à 14:38
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xuenylom Messages postés 6 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 6 août 2004
6 août 2004 à 14:39
REMARQUE: ca se voit pas sur le forum, mais ce sont des tabulations, sauf dans "truc 5 truc"
0
xuenylom Messages postés 6 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 6 août 2004
6 août 2004 à 14:44
: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.
0
xuenylom Messages postés 6 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 6 août 2004
6 août 2004 à 14:55
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
0
Rejoignez-nous