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

  1. #1
    Membre du Club
    Homme Profil pro
    Automaticien
    Inscrit en
    mai 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : mai 2011
    Messages : 68
    Points : 64
    Points
    64
    Par défaut [encodage caractère] lire fichier .csv UCS-2
    Bonjour,

    Je dois extraire les données d'un fichier .CSV généré par un logiciel propriétaire.
    Le script ci-dessous fonctionne à la condition que le fichier .csv soit encodé en UTF-8 ou en ANSI. Malheureusement, le fichier généré est encodé en UCS-2 et mon script ne renvoie aucun résultat.

    Comment imposer l'encodage de caractères à utiliser ?
    (ou à la rigueur, comment convertir le fichier avant utilisation?)
    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
     
    FILE *fpFile;
    char buffer[100];
    char *token;
    char c1[10], c2[10], c3[12], c4[10], c5[10];
    int nCol,nLigne;
     
    fpFile = fopen("fichier.csv", "r" ); //ouverture du fichier en lecture
     
    nLigne = 1; // initialisation du n° de ligne
    while (fgets (buffer, 100 , fpFile)) // Lecture d'une ligne du fichier
    {
    	printf("| Lecture de la ligne %d: ", nLigne);	
    	nCol = 1; // initialisation du n° de colonne
     
    	// Rechercher les valeurs dans les colonnes
    	token = strtok(buffer,","); // Lecture de la premiere colonne
    	while(token != NULL) {
    		switch(nCol){ // Affectation de la valeur du token à la colonne
    			case 1:	sprintf(c1,"%s",token);	break;
    			case 2: sprintf(c2,"%s",token); break;
    			case 3: sprintf(c3,"%s",token); break;
    			case 4: sprintf(c4,"%s",token); break;
    			case 5: sprintf(c5,"%s",token); break;
    		} //switch							
    		token = strtok(NULL,","); // lecture de la colonne suivante
    		nCol++; //Incrémente le N° de colonne
    	}//while colonne
    	printf("; Nb colonnes lues = %d\r\n",nCol-1);
     
    	/*                                   */
    	/*    Traitement des données lues    */
    	/*                                   */
     
    	nLigne++; //Passage à la ligne suivante
    } //while

    Merci pour votre lumière !
    Mikael.



    Un peu de contexte: Je développe une interface de supervision industrielle avec le Progiciel WinCC Professional V16 de Siemens. Le script ci-dessous est exécuté par WinCC. Le Fichier CSV est généré par le logiciel de gestion de stock Movex et est déposé quotidiennement sur mon serveur. Je n'ai pas ma main sur ce fichier et dois l'exploiter tel quel.

  2. #2
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 3 882
    Points : 8 686
    Points
    8 686
    Par défaut
    USC-2 n'existe plus depuis 98/ Windows 98. Il a été remplacé par l'UTF-16

    De +, tu confonds ASCII et ANSI
    ANSI, c'est le terme Microsoft pour définir l'encodage MBCS ("codepage") par défaut.

    Parce que l'UTF-8 est compatible ASCII, MBCS étend l'ASCII pour avoir des caractères spéciaux (accent, tilde, ...)

    Sinon pour ta question , le C gère

    Si tu veux gérer l'UTF-8 c'est chiant, parce qu'il faut utiliser le type unsigned char, et donc caster partout

    Il faut convertir tes caractères UTF-16 en UTF-8 : je te laisse chercher 1 bibliothèque qu'il le fasse.

    tu peux aussi ouvrir ton fichier en binaire et parser le "stream" pour avoir les caractères UTF-16.

  3. #3
    Membre confirmé
    Femme Profil pro
    ..
    Inscrit en
    décembre 2019
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 91
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : décembre 2019
    Messages : 242
    Points : 535
    Points
    535
    Par défaut
    Salut,

    Avec l'utilitaire iconv : iconv -f UCS-2 -t ASCII in.csv > out.csv

  4. #4
    Membre du Club
    Homme Profil pro
    Automaticien
    Inscrit en
    mai 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Automaticien

    Informations forums :
    Inscription : mai 2011
    Messages : 68
    Points : 64
    Points
    64
    Par défaut
    Bonjour et merci pour vos réponses,

    Je ne pense pas confondre ANSI et ASCII, le bloc-notes Windows tout comme Notepad++ proposent bien ANSI et non ASCII dans le choix du type d'encodage.

    J'ai exploré un peu vos solutions,
    Dans la bibliothèque wchar.h, je pensais pourvoir m'en sortir en exploitant fgets et wcsrtombs mais mon compilateur s'obstine à ne pas reconnaitre le type mbstate_t.

    Iconv me parait être une solution intéressante, comme j'ai peu de temps à consacrer au sujet, j'ai mis un stagiaire sur le coup.
    Je donnerai des nouvelles…

    A+

  5. #5
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 3 882
    Points : 8 686
    Points
    8 686
    Par défaut
    Citation Envoyé par LePingouin Voir le message
    Je ne pense pas confondre ANSI et ASCII, le bloc-notes Windows tout comme Notepad++ proposent bien ANSI et non ASCII dans le choix du type d'encodage.
    Oui c'est normal je l'ai dit "MBCS étend l'ASCII pour avoir des caractères spéciaux (accent, tilde, ...)"

    L'ASCII est 1 encodage de 128 caractères, qui n'a besoin que de 7 bits ... mais il manque beaucoup de caractères (spéciaux, cyrillique, kanji, ...)
    Et avant l'Unicode, MBCS ("Multi Byte Character Set") ou les "code pages" permet de compléter sur 1 octet (128 caractères de +) ou sur 2 octets (comme Shift JIS)
    Je n'ai pas vérifié, mais je pense que tous les "code pages" conservent l'ASCII pour les caractères entre 0 et 127.

    Windows code page, page wikipedia

    ANSI, en France, correspond au "code page" 1252, dit Latin 1 Western European.

    Donc, avec Windows, l'ANSI est proposé 1 peu partout : Notepad, Visual C++, par exemple


    Citation Envoyé par LePingouin Voir le message
    Dans la bibliothèque wchar.h, je pensais pourvoir m'en sortir en exploitant fgets et wcsrtombs mais mon compilateur s'obstine à ne pas reconnaitre le type mbstate_t.
    Ce type semble avoir été introduit avec la norme C95. Donc il faudrait forcer la norme C99 (gcc -std=c99 ..., par exemple)

Discussions similaires

  1. Lire fichier CSV, caractères non reconnus
    Par bejust dans le forum Général Java
    Réponses: 3
    Dernier message: 05/04/2011, 11h45
  2. lire fichier csv
    Par oudghouti dans le forum VB.NET
    Réponses: 12
    Dernier message: 20/01/2010, 15h40
  3. Lire fichier CSV avec tabulation comme séparation
    Par theNoob dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2009, 18h52
  4. lire fichier csv
    Par nico0812 dans le forum C#
    Réponses: 4
    Dernier message: 17/04/2007, 18h40
  5. lire fichier csv et en extraire des infos
    Par isaglada dans le forum VBScript
    Réponses: 2
    Dernier message: 12/02/2007, 13h04

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