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

Shell et commandes GNU Discussion :

[Shell] CSV import , caractères spéciaux


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut [Shell] CSV import , caractères spéciaux
    Bonjour,

    J'essaye toujours d'importer des fichiers csv dans une base de données.
    J'ai un probleme quand une ligne de mon fichier contient le caractère ' ou ; .
    Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <b>font color='red' ...
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pvit.listPVToDisplay; 702;701;10114;703....

    En effet le " ' " est utilisé dans la ligne de commande qui envoie les variables dans la base de données et il les interprete donc lorsqu'une ligne en contient...

    Le ; est mon séparateur de champs et au lieu d'envoyer par exemple la ligne : "701;10114;702" , il envoie "701" uniquement .

    Dois je faire préalablement une reconstruction du fichier en remplaçant ces 2 caractères spéciaux par autre chose ou bien puis-je les préserver avec une méthode ? (Normalement je ne peux pas toucher aux données).

    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Bon j'ai reconverti le fichier en utilisant des separateurs " | " au lieu des " ; ".

    Ca a l'air de regler un des deux problemes.

    Par contre je ne vois vraiment pas pour le single quote ....

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Pour apporter plus de précision je vous donne le code que j'utilise pour importer le fichier en question dans ma BDD.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    cat fichier.csv | while read line; do
      VAR1=`echo $line | awk -F "|" '{ print $1}'`
      VAR2=`echo $line | awk -F "|" '{ print $2}'`
      SQL="INSERT INTO kv (kv_name, kv_val) VALUES ('$VAR1', '$VAR2');"
      echo $SQL >> tmpfile1.csv
    done
     
    psql -U utilisateur BaseDeDonnée < tmpfile1.csv
    Le probleme est au niveau des " ' " obligatoires sur $VAR1 et VAR2...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    Peux tu donner un exemple de lignes de ton fichier csv stp pour que l'on se rende encore mieux compte de ce que tu dois faire et ce que tu souhaites récupérer.

    merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    .
    .
    .
     pvit.searchHowLongBefore| 0
     planning.activeFiltre| true
     planning.debug_| 9424
     pvit.listPVToDisplay| 702;701;10114;703;710;10116;10117;700
     pvit.newPVIT| true
     planning.deleteDelay| 0
     planning.blockAdministrationDelay| 0
     planning.blockAdministration| true
     shutdown.message| Le serveur sera arrêté à 14h30 pendant 5 minutes
     shutdown.messageWB| <b><font color ='red'>Arrêt imminent du serveur à* 14h30 pendant 5 minutes.</font></b>
    Voici quelques lignes avec "la" ligne qui bloque ma moulinette.
    Il n'aime pas le 'red' sans doute à cause que la quote de cette ligne ferme prématurement la quote du '$VAR2'...
    Et je ne vois pas comment l'eviter .

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    alors j'ai repris ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat fichier.cvs|while read line; do
      VAR1=`echo $line|awk -F"|" '{print $1}'`
      VAR2=`echo $line | awk -F"|" '{print $2}'`
      SQL="INSERT INTO kv (kv_name, kv_val) VALUES ('$VAR1', '$VAR2');"
      echo $SQL >> tmpfile1.csv
    done
    a la différence que je n'ai pas mis d'espace entre -F et "|" (normalement il n'y en a pas, en tout cas moi je n'en mets jamais)

    et voila ce que je trouve dans tmpfile1.csv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT INTO kv (kv_name, kv_val) VALUES ('pvit.searchHowLongBefore', '0');
    INSERT INTO kv (kv_name, kv_val) VALUES ('planning.activeFiltre', 'true');
    INSERT INTO kv (kv_name, kv_val) VALUES ('planning.debug_', '9424');
    INSERT INTO kv (kv_name, kv_val) VALUES ('pvit.listPVToDisplay', '702;701;10114;703;710;10116;10117;700');
    INSERT INTO kv (kv_name, kv_val) VALUES ('pvit.newPVIT', 'true');
    INSERT INTO kv (kv_name, kv_val) VALUES ('planning.deleteDelay', '0');
    INSERT INTO kv (kv_name, kv_val) VALUES ('planning.blockAdministrationDelay', '0');
    INSERT INTO kv (kv_name, kv_val) VALUES ('planning.blockAdministration', 'true');
    INSERT INTO kv (kv_name, kv_val) VALUES ('shutdown.message', 'Le serveur sera arrêté à 14h30 pendant 5 minutes');
    INSERT INTO kv (kv_name, kv_val) VALUES ('shutdown.messageWB', '<b><font color ='red'>Arrêt imminent du serveur à* 14h30 pendant 5 minutes.</font></b>');
    je n'ai pas eu de problème avec 'red' comme toi, donc est-ce que cela devrait te donner ceci??

    ou alors est-ce que le problème ne vient que lors de ton import de ton fichier dans la base??

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    C'est lors de l'injection des données dans la base que ca plante ^^.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    psql -U utilisateur BaseDeDonnée < tmpfile1.csv
    Le fichier en lui meme est correct.

    il contient une série de fois cette instruction ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO key_value (kv_name, kv_value, id_import) VALUES ('$VAR1', '$VAR2');
    On a donc ceci pour la ligne qui plante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO key_value (kv_name, kv_value, id_import) VALUES ('shutdown.messageWB', '<b><font color ='red'>');
    En rouge la quote qui gene le tout et en vert la quote qui fait partie de la requete .

    Je pense que c'est plus explicite comme cela ^^.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    ok c'est bien ce que je pensais après.

    alors normalement pour ne pas prendre en compte le caractère spécial ' tu devrais mettre \ devant mais je ne sais pas du tout si cela va fonctionner par la suite.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    non car tout est consideré comme du texte ^^.

    Donc si je met le "\" il va importer le caractere "\" tel quel dans la base il me semble. Il butera toujours sur le '.

    En fait j'ai deja essayé ^^.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    et il te met quoi comme erreur en fait?

    parce qu'en fait c'est étonnant que ' t'embête comme ça à partir du moment oùtu n'as pas eu d'erreur lors de la création de ton fichier tmpfile1.csv. Derrière ce n'est qu'un import d'une requête dans une base qui, fait à la main, doit certainement fonctionner. Si tu vois ce que je veux dire.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Bah il injecte pas cette ligne justement :>

    Voila ce qu'il me met.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR:  syntax error at or near "red"
    LINE 1: ... VALUES ('shutdown.messageWB', ' <b><font color ='red'>...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 81
    Par défaut
    d'accord

    dc là je vais t'avouer que je ne vois pas tro bien comment résoudre ton problème , mis à part peut-être essayer de jouer avec les guillemets mais je suppose que tu as déjà du essayer et ca n'est pas gagné.

    dsl

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Bah la j'ai essayé en remplaçant les single quote par des doubles.

    Ca ne passe pas non plus ;s...

  14. #14
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    et si tu essaye de remplacer ' avec Alt-Gr+7 =>` ?

    Code Remplacer ' par ` : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO key_value (kv_name, kv_value, id_import) VALUES (`shutdown.messageWB`, `<b><font color ='red'>`);
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  15. #15
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 13
    Par défaut
    Bonjour ,

    Apres un petit essai ... ca fonctionne avec ca ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat fichier.cvs|while read line; do
      VAR1=`echo $line|awk -F"|" '{print $1}' | sed "s/'/\"/g"`
      VAR2=`echo $line | awk -F"|" '{print $2}' | sed "s/'/\"/g"`
      SQL="INSERT INTO kv (kv_name, kv_val) VALUES ('$VAR1', '$VAR2');"
      echo $SQL >> tmpfile1.csv
    done
    resultat ... si je me trompe pas
    pvit.searchHowLongBefore | 0
    planning.activeFiltre | true
    planning.debug_ | 9424
    pvit.listPVToDisplay | 702;701;10114;703;710;10116;10117;700
    pvit.newPVIT | true
    planning.deleteDelay | 0
    planning.blockAdministrationDelay | 0
    planning.blockAdministration | true
    shutdown.message | Le serveur sera arrê à 4h30 pendant 5 minutes
    shutdown.messageWB | <b><font color ="red">Arrêimminent du serveur à 14h30 pendant 5 minutes.</font></b>

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Par défaut
    Un collègue m'a aidé a trouver une solution qui semble marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vi -c "1,$ s/\\'/\\'\'/g|wq" fichier.csv
    ligne qui compose un script à part modifiant le fichier.csv à sa source.

    on obtient alors ''red'' ce qui est interpreté tel que je le voulais par SQL...

    Merci quand meme pour les idées ^^.


    Maintenant je règle un autre probleme ( snif déprimant :p) . Le fichier csv contient une ligne blanche superflue et donc au lieu d'obtenir X row, j'en obtiens X + 1 vide par importation. ^^

  17. #17
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 13
    Par défaut
    Dans ce cas la .. quand tu fais un cat de ton fichier tu rajoutes un grep ..

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat fichier.cvs|grep -Ev "^($)" | while read line; do
      VAR1=`echo $line|awk -F"|" '{print $1}' | sed "s/'/\"/g"`
      VAR2=`echo $line | awk -F"|" '{print $2}' | sed "s/'/\"/g"`
      SQL="INSERT INTO kv (kv_name, kv_val) VALUES ('$VAR1', '$VAR2');"
      echo $SQL >> tmpfile1.csv
    done
    ca te retire ta ligne vide

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

Discussions similaires

  1. Extraction csv et caractères spéciaux
    Par pop_up dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 15/03/2013, 17h23
  2. [MySQL] Encodage caractères spéciaux après import csv
    Par snorky94 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/10/2012, 15h27
  3. [Encodage] Exporter un CSV avec caractères spéciaux pour Excel
    Par gwinyam dans le forum Langage
    Réponses: 10
    Dernier message: 22/02/2011, 11h44
  4. Caractères "spéciaux" - problème d'import csv
    Par subarud dans le forum SAS Base
    Réponses: 0
    Dernier message: 15/06/2009, 12h02
  5. [MySQL] import CSV et caractères spéciaux
    Par loganblack dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 23/04/2008, 22h55

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