Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/04/2008, 11h16   #1
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
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 :
<b>font color='red' ...
et

Code :
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.
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h09   #2
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
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 ....
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 12h34   #3
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
Pour apporter plus de précision je vous donne le code que j'utilise pour importer le fichier en question dans ma BDD.

Code :
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...
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 13h41   #4
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 81
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2008
Messages : 81
Points : 34
Points : 34
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
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 13h52   #5
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
Code :
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 .
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 14h30   #6
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 81
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2008
Messages : 81
Points : 34
Points : 34
alors j'ai repris ton code
Code :
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 :
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??
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 14h39   #7
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
C'est lors de l'injection des données dans la base que ca plante ^^.

Code :
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 :
INSERT INTO key_value (kv_name, kv_value, id_import) VALUES ('$VAR1', '$VAR2');
On a donc ceci pour la ligne qui plante :

Code :
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 ^^.
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 15h03   #8
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 81
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2008
Messages : 81
Points : 34
Points : 34
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.
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 15h07   #9
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
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é ^^.
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 15h14   #10
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 81
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2008
Messages : 81
Points : 34
Points : 34
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.
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 15h27   #11
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
Bah il injecte pas cette ligne justement :>

Voila ce qu'il me met.

Code :
1
2
ERROR:  syntax error at or near "red"
LINE 1: ... VALUES ('shutdown.messageWB', ' <b><font color ='red'>...
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 15h45   #12
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 81
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : janvier 2008
Messages : 81
Points : 34
Points : 34
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
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 15h53   #13
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
Bah la j'ai essayé en remplaçant les single quote par des doubles.

Ca ne passe pas non plus ;s...
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2008, 17h01   #14
Membre Expert
 
Homme
budget et contrôle de gestion
Inscription : décembre 2006
Messages : 896
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

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

Informations forums :
Inscription : décembre 2006
Messages : 896
Points : 1 547
Points : 1 547
Salut,

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

Code Remplacer ' par ` :
INSERT INTO key_value (kv_name, kv_value, id_import) VALUES (`shutdown.messageWB`, `<b><font color ='red'>`);
Winnt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2008, 09h20   #15
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 13
Points : 14
Points : 14
Bonjour ,

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

Code :
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
Citation:
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>
tuxcoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2008, 09h56   #16
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
Un collègue m'a aidé a trouver une solution qui semble marcher :

Code :
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. ^^
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2008, 14h06   #17
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 13
Points : 14
Points : 14
Dans ce cas la .. quand tu fais un cat de ton fichier tu rajoutes un grep ..

Exemple :
Code :
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
tuxcoin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h14.


 
 
 
 
Partenaires

Hébergement Web