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 07/04/2008, 16h01   #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] import CSV dans une base de données.

Bonjour,

J'essaye d'importer un fichier CSV dont les champs sont séparés par des ";" dans une base de donnée postgreSQL.

Le probleme est que je ne vois pas trop comment réussir à saisir ligne par ligne les données de mon fichier pour ensuite injecter les données tout en respectant la Cast.

Donc, mon fichier CSV comporte : ID; Nom; Jour; N°jour; Mois; Taille

et je dois importer ces données dans la table qui contient les colonnes suivantes ( dans l'ordre) : ID (entier), Nom (varchar), Date (timestamp), Taille (entier).

C'est un vrai casse tête et comme je débute ....

Merci d'avance.
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 09h15   #2
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
Pas d'idée ?

J'ai parcouru le net et je suis tombé sur une source comme ceci :
Je n'y ai rien changé si ce n'est le nom du fichier et le nom de mes variables, mais apparement il calle apres le "for".

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
I=0
for line in `fichier.csv`
do
  while read ligne
  do
    VAR3=`echo $ligne | awk -F ";" '{ print $3}'`
    VAR4=`echo $ligne | awk -F ";" '{ print $4}'`
    if [ "$I" -ne 0 ]; then
      psql -U postgres DATABASE -c "INSERT INTO Table (ID, NOM) VALUES (CAST ('$3') AS INTEGER, $4)"
    fi 
  I=`expr I+1`
  done
done
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 09h30   #3
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
essaie ceci

Code :
1
2
3
4
5
6
7
8
9
10
 
cat fichier.cvs|while read line; do
    VAR3=`echo $ligne | awk -F ";" '{ print $3}'`
    VAR4=`echo $ligne | awk -F ";" '{ print $4}'`
    if [ "$I" -ne 0 ]; 
    then
        psql -U postgres DATABASE -c "INSERT INTO Table (ID, NOM) VALUES (CAST ('$3') AS INTEGER, $4)"
    fi 
    I=`expr I+1`
done
je n'ai pas testé à l'intérieur du while mais déjà tu devrais pouvoir rentrer dedans si c'est ça qui n'allait pas.
panach91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 09h45   #4
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
il passe bien dans la boucle, mais les variables ne sont pas remplies correctement .

Si je fais un

juste apres son initialisation par exemple, il m'affiche une succession de 'blanc' alterner avec une erreur 'invalid input syntax for integer' comme résultat.
Bien entendu ma base reste vide ^^.

Comment faire pour que la variable s'initialise correctement ? Ca m'arrive souvent quand j'utilise les variables $1 $2 $3 .... elles ont une durée de vie tres limitée -_-'.
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 09h56   #5
Invité de passage
 
Inscription : avril 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 24
Points : 4
Points : 4
non c'est bon j'ai trouvé. Probleme de syntaxe, je vais aller m'acheter des lunettes .

Merci ca marche .
AngeDéchu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 13h02   #6
Futur Membre du Club
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 18
Points : 18
Bonjour,

Désolé de déterrer ce message, mais j'ai à peu de chose près le même problème qu'AngeDéchu.
J'essaye, via KSH, de lire un fichier CSV (séprateur : ";") et d'associer chaque ligne du fichier à une ligne d'un tableau (cf. exemple ci-dessous).

Fichier toto.csv :
blablabla;01/01/2012
blablabli;01/01/2012
blablablu;01/01/2012
blablablo;01/01/2012

J'aimerai que ce fichier soit donc lu, ligne par ligne, et que les données soient insérées dans un tableau à 2 dimensions.

Etant débutant en KSH, je me suis totalement inspiré du code d'AngeDéchu comme suit :
Code :
1
2
3
4
5
6
7
8
9
10
#!/bin/ksh
#Insertion des champs fichier et date dans un tableau
 
cat toto.csv|while read line; do
    VAR1=`echo $ligne | awk -F ";" '{print $1}'`
    VAR2=`echo $ligne | awk -F ";" '{print $2}'`
    I=`expr I+1`
done
 
exit 0
Dans un premier temps, afin de savoir si mon fichier est bien lu, je désire afficher les valeurs que le awk lit. Cependant, rien ne s'affiche

Sauriez-vous me dire pourquoi?

D'avance, merci!
pressdell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 15h03   #7
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 182
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 182
Points : 267
Points : 267
Le resultats sont affectés aux variables $VAR1 et $VAR2 qui ne sont pas affichées.
Il faut enlever
VAR1= et VAR2=
ou
rajouter leur affichage dans la boucle ( echo $VAR1 $VAR2 par exemple )
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 15h43   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 077
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 077
Points : 4 180
Points : 4 180
Bonjour,

Comment parser /lire un fichier
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 18h17   #9
Futur Membre du Club
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 18
Points : 18
Bonjour Jean.Cri1,

Merci d'avoir pris le temps de me répondre. Comme tu le vois, je suis loin d'être un expert (mon erreur était pourtant évidente).

Pour information, j'ai également trouvé la méthode suivante (et qui fonctionne parfaitement).

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
inputfile="./toto.csv"
 
OLDIFS="$IFS"
IFS=";"
while read NAME VALUES ; do
   echo $NAME
   echo $VALUES
done < "$inputfile"
IFS="$OLDIFS"
 
exit 0
Comment dois-je procéder pour affecter mes variables NAMES et VALUES dans un tableau? Entre le While et le done, ça je pense que oui, mais NAMES et VALUES ne sont-elles pas des tableaux?
pressdell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 18h20   #10
Futur Membre du Club
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 18
Points : 18
Bonjour N_BaH,

Effectivement j'étais déjà tombé sur votre message, mais d'autres recherches me poussaient vers le AWK, et donc je ne suis pas revenu aux bases!

Merci tout de même, je pense utiliser :
Code :
1
2
3
while IFS=';' read -a Array
do echo "${Arrray[@]}"
done < fichier.csv
EDIT : Cher N_BaH, j'ai un petit soucis :
read: 0403-010 Option non valide pour cette commande.
Il apparaît que le -a n'est pas le bienvenu (je ne suis pas en KSH, mais SH).

Dois-je finalement m’atteler au AWK?

Cordialement!
pressdell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 19h29   #11
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 077
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 077
Points : 4 180
Points : 4 180
SH ne peut pas utiliser les tableaux.

pourquoi penses-tu avoir besoin d'un tableau ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2012, 21h14   #12
Futur Membre du Club
 
Inscription : mai 2007
Messages : 63
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 63
Points : 18
Points : 18
Et bien je pensais stocker les lignes de mon fichier CSV dans un tableau, puis boucler sur les lignes de ce denier afin d'effectuer quelques opérations.
En écrivant celà je me rentre compte que je peux effectuer ces opérations directement dans mon while...mais je suis habitué à stocker mes sources avant de les exploiter, d'où mon erreur.

Merci en tout cas pour ton attention.

Cordialement.
pressdell 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 19h22.


 
 
 
 
Partenaires

Hébergement Web