#1 Le 22/05/2014, à 10:51
- McRbt
Script : analyse et traitement fichier .csv
Bonjour/Bonsoir,
Je voudrais créer un script qui puisse analyser et traiter des fichiers au format .csv.
Ces fichiers au format .csv ont un en-tête et un pied de page. Le pied de page de ces derniers n'a qu'une
information importante, c'est le nombre de ligne que possède ces fameux fichiers.
De plus, les données dans ces fichiers sont "classées". C'est-à-dire que la première information de chaque ligne
est un nombre (compris en 0 et 99) et qui permet de définir à quoi correspond les informations qui suivent.
Par exemple :
00 = en-tête
01 = bonbon rouge
01 = bonbon rouge
02 = bonbon vert
03 = bonbon rose
03 = bonbon rose
99 = pied de page
Dans un premier temps, il faudrait que le script compte les lignes du fichier passé en paramètre (sans compter
l'en-tête et le pied de page, théoriquement on soustrais 2 lignes) et compare le résultat avec le nombre de ligne
indiqué dans le pied de page.
Dans un second temps, j'aimerai créer et enregistrer un fichier .csv pour chaque type de donnée et que les informations
se suivent à la ligne.
Je m'explique :
00 = en-tête
01 = <monfichier>_01.csv
01 = <monfichier>_01.csv
02 = <monfichier>_02.csv
03 = <monfichier>_03.csv
03 = <monfichier>_03.csv
99 = pied de page
Voici ce que j'ai commencé :
#!/bin/bash
echo ""
echo "******************************************"
echo "************* Script test.sh *************"
echo "******************************************"
echo ""
if [ -z $1 ] #si aucun paramètre
then
echo "Sélectionnez un fichier à analyser et à traiter" #message d'entrée
read -p "Chemin d'accès au fichier : " FULL_FILE_NAME #sélection du fichier via son chemin d'accès
FULL_FILE_NAME=`basename $FULL_FILE_NAME` #on initialise une variable pour la basename du fichier
echo ""
else
FULL_FILE_NAME=$1 #paramètre intégré à une variable
FULL_FILE_NAME=`basename $1` #on initialise une variable pour la basename du fichier
fi
FILE_NAME=${FULL_FILE_NAME%.*} #on initialise une variable pour la basename du fichier sans extension
echo -n "Comptage du nombre total de ligne..."
NB_LIGNE_TOTAL=`sed -n '$=' $FULL_FILE_NAME` #on compte le nombre de ligne et les intègre dans une variable
echo "OK"
echo 'Le fichier "'$FULL_FILE_NAME'" dispose de '$NB_LIGNE_TOTAL' lignes.' #on informe l'utilisateur du compte qui vient d'être effectué
echo ""
echo -n "Affiliation du délimiteur et intégration des données..."
while IFS=, read type_donnee user login toc #on indique le délimiteur utilisé et initialise les valeurs dans des variables
do
for indicateur_type in $type_donnee #on initialise une variable pour les type de données et boucle
do
echo "$type_donnee;$user;$login;$toc" >> /home/valentin/Documents/Dossier_Test/"$FILE_NAME"_"$indicateur_type".csv #on enregistre les types de données séparément
done
done < $FULL_FILE_NAME #on indique le fichier pour la boucle WHILE
echo "OK"
echo "Des fichiers CSV ont étés créés."
Je voudrais vos avis pour mon début de script, voir si je ne vais pas dans un mur et avoir un maximum de conseils.
Je reste à votre disposition pour de plus amples informations si nécessaire.
Dernière modification par McRbt (Le 22/05/2014, à 13:43)
Hors ligne
#2 Le 22/05/2014, à 11:13
- pingouinux
Re : Script : analyse et traitement fichier .csv
Bonjour,
Remarque :
À chaque itération de la boucle while, type_donnee a une valeur, celle de la ligne que tu viens de lire. La boucle for ne sert à rien.
Hors ligne
#3 Le 22/05/2014, à 11:32
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
Exact pour la boucle while, mais imaginons qu'il est 80 type de données, dois-je créer 80 variables ?
Ensuite, j'ai installé la boucle for pour avoir la variable indicateur_type qui me permet d'enregistrer mes fichiers .csv selon le type de donné.
Le mieux serait que le script fonctionne de façon totalement automatique. Peu importe ce que le fichier .csv passé en paramètre contient, il devrait pouvoir être vérifier et découpé en fonction des types de donnée.
Hors ligne
#4 Le 22/05/2014, à 12:02
- pingouinux
Re : Script : analyse et traitement fichier .csv
Tu as bien un seul fichier au départ ?
Peux-tu donner un exemple de fichier avec quelques types de données, et ce que tu veux en sortie ?
Hors ligne
#5 Le 22/05/2014, à 12:19
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
En effet, il y a un seul fichier en entrée.
J'ai créé un exemple vraiment très simple ci-dessous :
0,"Drposttototjnfckfdhkjf",,
1,3,"FRGDSFYSD",
1,3,"WHH",
1,5,"WHH",
1,7,"WHH",
1,6,,
2,"R54R",4,"ERRQST"
2,"R4ER",4,"QGGGQ"
2,"ERRE",4,"QGGGQ"
2,"RTR",4,
3,3,"RQGG",
3,3,"GGG",
3,3,"GGG",
99,14,,
Voilà ce que je devrais obtenir
Type de donnée 1 :
1;3;"FRGDSFYSD";
1;3;"WHH";
1;5;"WHH";
1;7;"WHH";
1;6;;
Type de donnée 2 :
2;"R54R";4;"ERRQST"
2;"R4ER";4;"QGGGQ"
2;"ERRE";4;"QGGGQ"
2;"RTR";4;
Type de donnée 3 :
3;3;"RQGG";
3;3;"GGG";
3;3;"GGG";
Pour chaque type de donnée, un fichier .csv doit être créé.
Dans cet exemple, 3 fichiers doivent être créés.
Les numéros de type de donnée ne sont pas forcément consécutif ni significatif, ils permettent juste de séparer les différentes données.
EDIT : Le type de donnée 00 correspond à l'en-tête avec certaines informations qui ne sont pas utiles ici.
Le type de donnée 99 correspond au pied de page et contient le nombre de ligne que doit avoir le fichier.
Avant que le script commence, une vérification est nécessaire.
si nombre_ligne_pied_page = comptage_nombre_ligne
alors le script s'exécute
sinon erreur
Dernière modification par McRbt (Le 22/05/2014, à 12:26)
Hors ligne
#6 Le 22/05/2014, à 13:47
- pingouinux
Re : Script : analyse et traitement fichier .csv
Voici une suggestion, en utilisant awk :
#!/bin/bash
fic="$1" # Vérifier l'existence du fichier
lon=$(wc -l "$fic"|awk '{print $1}')
lon_lu=$(awk -F, '/^99,/{print $2}' "$fic")
echo $lon $lon_lu # Vérifier que $lon==$lon_lu
awk -F, -v OFS=";" -v fic="$fic" '{if($1==0||$1==99)next;$1=$1;print>fic"_"$1".csv"}' "$fic"
Hors ligne
#7 Le 22/05/2014, à 14:34
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
Le code que tu viens de me fournir fonctionne comme je le souhaite.
Le nombre de ligne apparaît bien, les fichiers sont bien créés avec le contenu qu'il faut.
Cependant, je ne comprend pas tout :
Pour la variable $lon_lu, tu lui demande juste de lire ce qui suit ?
Pour finir, pourrais-tu me détailler la dernière ligne ?
Dernière modification par McRbt (Le 22/05/2014, à 14:46)
Hors ligne
#8 Le 22/05/2014, à 14:55
- pingouinux
Re : Script : analyse et traitement fichier .csv
Pour la variable $lon_lu, tu lui demande juste de lire ce qui suit ?
lon_lu=$(awk -F, '/^99,/{print $2}' "$fic")
Je définis la virgule comme séparateur de champs, cherche la ligne commençant par "99,", et lis le 2ème champ.
Pour finir, pourrais-tu me détailler la dernière ligne ?
Je définis la virgule comme séparateur de champs en entrée, et le ";" en sortie.
Je ne traite que les lignes dont le 1er champ est différent de 0 ou 99.
J'écris à la fin du fichier dont le nom est composé ainsi : nom_du_fichier_d_entrée + 1er champ + ".csv"
Hors ligne
#9 Le 23/05/2014, à 10:34
- McRbt
Re : Script : analyse et traitement fichier .csv
Bonjour,
Après avoir continué le script, j'ai remarqué une erreur lors du comptage des lignes avec la commande sed.
echo -n "Comptage du nombre total de ligne..."
NB_LIGNE_TOTAL=`sed -n '$=' $FULL_FILE_NAME` #on compte le nombre de ligne et les intègre dans une variable
echo "OK"
Si je ne suis pas dans le bon répertoire, la commande sed me retourne :
sed: can't read /home/valentin/Documents/Dossier_Test/testfichier.csv: No such file or directory
EDIT : Il me dit qu'il ne peut le lire mais me donne le chemin d'accès que j'avais saisi auparavant.
Si je suis dans le dossier, où se trouve le fichier en question, la commande fonctionne à merveille, même si le chemin d'accès saisi est identique.
Cordialement.
Dernière modification par McRbt (Le 23/05/2014, à 10:40)
Hors ligne
#10 Le 23/05/2014, à 11:05
- pingouinux
Re : Script : analyse et traitement fichier .csv
C'est curieux. Peux-tu montrer le début du script (jusqu'au sed) tel qu'il est actuellement, et la façon dont tu le lances ?
Il y a des choses qui me paraissent bizarres dans celui que tu montres en #1, mais qui n'expliquent pas ce message d'erreur.
Que donne cette commande
ls -l /home/valentin/Documents/Dossier_Test/testfichier.csv
Hors ligne
#11 Le 23/05/2014, à 11:22
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
Tu vas m'insulter mais en fait le fichier testfichier.csv se trouve dans un autre répertoire, c'est pour cela que ça ne fonctionne pas ..
Il y a des choses qui me paraissent bizarres dans celui que tu montres
Je suis preneur, je t'écoute.
Dernière modification par McRbt (Le 23/05/2014, à 11:23)
Hors ligne
#12 Le 23/05/2014, à 11:34
- pingouinux
Re : Script : analyse et traitement fichier .csv
Il faut voir le script actuel. Celui en #1 ne peut pas donner le message d'erreur en #9.
Hors ligne
#13 Le 23/05/2014, à 11:40
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
#!/bin/bash
echo ""
echo "******************************************"
echo "************* Script test.sh *************"
echo "******************************************"
echo ""
if [ -z $1 ] #si aucun paramètre d'entrée
then
echo "Sélectionnez un fichier à analyser et à traiter" #message d'entrée
read -p "Chemin d'accès au fichier : " FULL_FILE_NAME_IN #sélection du fichier via son chemin d'accès
FULL_FILE_NAME_IN_BASE=`basename $FULL_FILE_NAME_IN` #on initialise une variable pour la basename du fichier d'entrée
echo ""
else
FULL_FILE_NAME_IN=$1 #paramètre intégré à une variable
echo "Chemin d'accès : $1"
FULL_FILE_NAME_IN_BASE=`basename $1` #on initialise une variable pour la basename du fichier d'entrée
fi
echo -n "Comptage du nombre total de ligne..."
NB_LIGNE_COMPTAGE=`sed -n '$=' $FULL_FILE_NAME_IN` #on compte le nombre de ligne et les intègre dans une variable
echo "OK"
echo 'Le fichier "'$FULL_FILE_NAME_IN_BASE'" dispose de '$NB_LIGNE_COMPTAGE' lignes.' #on informe l'utilisateur du compte qui vient d'être effectué
echo -n "Vérification du nombre de ligne..."
NB_LIGNE_TOTAL=$(awk -F, '/^99,/{print $2}' "$FULL_FILE_NAME_IN") #on va chercher le nombre de ligne indiqué en fin de page
if [ $NB_LIGNE_COMPTAGE == $NB_LIGNE_TOTAL ] #on vérifie si le nombre de ligne est correct
then
echo "OK" #on informe l'utilisateur que la vérification a fonctionné
else
echo -e "\nERROR 99 : Le fichier n'est pas valide. Arrêt du script." #on informe l'utilisateur que la vérification a échoué et que le script s'arrête
exit
fi
if [ -z $2 ] #si aucun paramètre de sortie
then
echo "Sélectionnez un répertoire où enregistrer les fichiers de sortie"
read -p "Chemin de sortie : " FULL_FILE_NAME_OUT #sélection du dossier destination
echo ""
else
FULL_FILE_NAME_DEST=$2 #paramètre intégré à une variable
echo "Chemin de sortie : $2" #on informe l'utilisateur
fi
Voici le script actuel. Bien sûr il n'est pas terminé.
Celui en #1 ne peut pas donner le message d'erreur en #9.
Exact, quand j'ai vu l'erreur je me suis précipité sur le forum, alors qu'en fait il n'y en avait pas...
Hors ligne
#14 Le 23/05/2014, à 11:59
- pingouinux
Re : Script : analyse et traitement fichier .csv
Je comprends mieux, maintenant…
Quand tu utilises les paramètres d'entrée dans le script, il est préférable de les mettre entre " ". C'est surtout utile si les noms contiennent des espaces (ou si le paramètre est vide). Ton premier test if [ -z $1 ] marche par hasard lorsque $1 est vide.
Il en est de même de l'utilisation des variables d'environnement.
En cas d'erreur, il vaut mieux faire exit n, avec n différent de 0. Cela permet de tester éventuellement le code de retour du programme.
Hors ligne
#15 Le 23/05/2014, à 12:18
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
Quand tu utilises les paramètres d'entrée dans le script, il est préférable de les mettre entre " "
Tu parles bien de la variable FULL_FILE_NAME_IN ? Il faut que je mette cette variable entre " " ?
Ton premier test if [ -z $1 ] marche par hasard lorsque $1 est vide.
Je trouve ceci normal justement, si l'utilisateur lance le script sans paramètre, on lui en demande.
En cas d'erreur, il vaut mieux faire exit n, avec n différent de 0. Cela permet de tester éventuellement le code de retour du programme.
Pour cet exemple, j'ai remplacé exit par exit 2, le résultat est le même.
Chemin d'accès : /home/valentin/Documents/Projet/testfichier.csv
Comptage du nombre total de ligne...OK
Le fichier "testfichier.csv" dispose de 14 lignes.
Vérification du nombre de ligne...
ERROR 99 : Le fichier n'est pas valide. Arrêt du script.
Dernière modification par McRbt (Le 23/05/2014, à 12:26)
Hors ligne
#16 Le 23/05/2014, à 12:38
- pingouinux
Re : Script : analyse et traitement fichier .csv
1) Oui
2) Le test marche par hasard parce que c'est -z. Avec -n, par exemple, ce serait incorrect
$ [ -z ] && echo oui || echo non
oui
$ [ -z "" ] && echo oui || echo non
oui
$ [ -n ] && echo oui || echo non
oui
$ [ -n "" ] && echo oui || echo non
non
Il faut faire
if [ -z "$1" ]
3) Le résultat du script est évidemment le même. Pour voir la différence, il faudrait faire
./mon_script && echo OK || echo Pas OK
On peut aussi récupérer le code de retour, par exemple
./mon_script; code_retour=$?
code_retour vaudra alors 0 en cas de succès, 2 en cas d'erreur.
Hors ligne
#17 Le 23/05/2014, à 15:23
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
J'ai apporté les modifications nécessaires.
Pour le code retour, dans le cas où la vérification des lignes est bonne, le terminal me renvoie Ok.
Dans celui où la vérification n'est pas bonne, ce dernier me renvoie Pas ok.
Cependant, des problèmes viennent à la surface.
Avant de couper le .csv et d'enregistrer les types de donnée entre eux, il faudrait que l'utilisateur puisse choisir où stocker ses fichiers.
C'est ce que j'ai essayé de faire, mais awk n'est pas content (dernier paragraphe du code).
awk: read error (Is a directory)
De plus, peut-on ajouter un contrôle sur les commandes awk et sed ? Voire les autres ? De tel sorte que, si une erreur se produit, l'utilisateur puisse reprendre là où il est.
Par exemple, ce dernier fait une faute de frappe et ne saisi pas bien son fichier.
Code actuel :
#!/bin/bash
echo ""
echo "******************************************"
echo "************* Script test.sh *************"
echo "******************************************"
echo ""
if [ -z "$1" ] #si aucun paramètre d'entrée
then
echo "Sélectionnez un fichier à analyser et à traiter" #message d'entrée
read -p "Chemin d'accès au fichier : " "FULL_FILE_NAME_IN" #sélection du fichier via son chemin d'accès
FULL_FILE_NAME_IN_BASE=`basename $FULL_FILE_NAME_IN` #on initialise une variable pour la basename du fichier d'entrée
echo ""
else
FULL_FILE_NAME_IN=$1 #paramètre intégré à une variable
echo -e "Chemin d'accès : $1\n"
FULL_FILE_NAME_IN_BASE=`basename $1` #on initialise une variable pour la basename du fichier d'entrée
fi
FILE_NAME=${FULL_FILE_NAME_IN%.*}
echo -n "Comptage du nombre total de ligne..."
NB_LIGNE_COMPTAGE=`sed -n '$=' $FULL_FILE_NAME_IN` #on compte le nombre de ligne et les intègre dans une variable
echo "OK"
echo 'Le fichier "'$FULL_FILE_NAME_IN_BASE'" dispose de '$NB_LIGNE_COMPTAGE' lignes.' #on informe l'utilisateur du compte qui vient d'être effectué
echo -n "Vérification du nombre de ligne..."
NB_LIGNE_TOTAL=$(awk -F, '/^99,/{print $2}' "$FULL_FILE_NAME_IN") #on va chercher le nombre de ligne indiqué en fin de page
if [ $NB_LIGNE_COMPTAGE == $NB_LIGNE_TOTAL ] #on vérifie si le nombre de ligne est correct
then
echo -e "OK\n" #on informe l'utilisateur que la vérification a fonctionné
else
echo -e "\nERROR 99 : Le fichier n'est pas valide. Arrêt du script." #on informe l'utilisateur que la vérification a échoué et que le script s'arrête
exit
fi
if [ -z $2 ] #si aucun paramètre de sortie
then
echo "Sélectionnez un répertoire où enregistrer les fichiers de sortie"
read -p "Chemin de sortie : " "FULL_FILE_NAME_OUT" #sélection du dossier destination
echo ""
else
FULL_FILE_NAME_OUT=$2 #paramètre intégré à une variable
echo "Chemin de sortie : $2" #on informe l'utilisateur
fi
echo -n "Affiliation du délimiteur et intégration des données..."
awk -F, -v OFS=";" -v FULL_FILE_NAME_OUT="$FULL_FILE_NAME_OUT" '{if($1==0||$1==99)next;$1=$1;print>FILE_NAME"_"$1".csv"}' "$FULL_FILE_NAME_OUT" #on définie le délimiteur et enregistre tout les types de donnée entre eux au format .csv
echo "OK" #on informe l'utilisateur que l'opération a fonctionné
Hors ligne
#18 Le 23/05/2014, à 17:29
- pingouinux
Re : Script : analyse et traitement fichier .csv
1) Il manque encore de nombreux " " dans le script.
2) Je pense que tu veux faire ceci :
FILE_NAME="$FULL_FILE_NAME_OUT/FILE_NAME"
awk -F, -v OFS=";" -v fic="$FILE_NAME" '{if($1==0||$1==99)next;$1=$1;print>fic"_"$1".csv"}' "$FULL_FILE_NAME_IN"
3) Voici une méthode pour relancer une séquence de commandes aussitôt que l'une d'elles est en erreur
while true
do
commande1 ......... || continue
commande2 ......... || continue
exit
done
Pour arrêter complètement le script dès la première erreur, ajouter cette ligne au début (après la ligne #!/bin/bash)
set -e
Hors ligne
#19 Le 26/05/2014, à 09:51
- McRbt
Re : Script : analyse et traitement fichier .csv
pingouinux,
Je pense que tu veux faire ceci :
FILE_NAME="$FULL_FILE_NAME_OUT/FILE_NAME" awk -F, -v OFS=";" -v fic="$FILE_NAME" '{if($1==0||$1==99)next;$1=$1;print>fic"_"$1".csv"}' "$FULL_FILE_NAME_IN"
En fait, la variable FILE_NAME, je l'ai créé juste pour avoir le nom du fichier, et seulement le nom du fichier (sans extension, sans chemin d'accès), pour pouvoir enregistrer les autres fichiers par la suite.
Ensuite, ce que j'attends de la commande awk, c'est qu'elle coupe le fichier de base (avec les type de donnée, etc...) et qu'elle enregistre les parties de fichier.
En gros ça donnerait ceci lors de l'enregistrement des petits fichiers .csv :
<monfichier>.csv -> <monfichier>_<type_de_donnee>.csv
Mon idée était de caller <monfichier> dans la variable, FILE_NAME, pour faciliter l'enregistrement.
Voici une méthode pour relancer une séquence de commandes aussitôt que l'une d'elles est en erreur
while true do commande1 ......... || continue commande2 ......... || continue exit done
Au tout début de mon script, on demande le chemin d'accès à l'utilisateur. Admettons que ce dernier fasse juste une erreur de frappe et tape un chemin d'accès inexistant, il suffirait de faire :
while true
do
echo "Sélectionnez un fichier à analyser et à traiter" #message d'entrée
read -p "Chemin d'accès au fichier : " "FULL_FILE_NAME_IN" #sélection du fichier via son chemin d'accès
FULL_FILE_NAME_IN_BASE=`basename $FULL_FILE_NAME_IN` #on initialise une variable pour la basename du fichier d'entrée
echo ""
exit
done
C'est noté pour la commande set -e, je l'intègre de suite et essaye de voir quelles erreurs pourrait apparaître.
~~~~~~~~~~~~~~~~~~~~~~~~~
EDIT :
FILE_NAME="$FULL_FILE_NAME_OUT/FILE_NAME"
awk -F, -v OFS=";" -v fic="$FILE_NAME" '{if($1==0||$1==99)next;$1=$1;print>fic"_"$1".csv"}' "$FULL_FILE_NAME_IN"
Ceci fonctionne quasi à merveille ! Déjà tu as résolus mon problème de répertoire de sortie, c'est une bonne chose.
Il y a un juste un petit hic, les fichiers en sortie se nomment FILE_NAME_1.csv; FILE_NAME_2.csv; FILE_NAME_3.csv.
EDIT RESOLU :
Après re-lecture, j'ai vu qu'il y avait une faute dans les variables.
L'erreur venait d'ici :
FILE_NAME=${FULL_FILE_NAME_IN%.*}
J'ai remplacé par :
FILE_NAME=${FULL_FILE_NAME_IN_BASE%.*}
Par contre, je me pose une question, si les types de donnée commencent par un 0, est-ce possible, par exemple encore, d'obtenir <monfichier>_01.csv ?
Dernière modification par McRbt (Le 26/05/2014, à 11:36)
Hors ligne
#20 Le 30/05/2014, à 16:39
- McRbt
Re : Script : analyse et traitement fichier .csv
Bonjour,
Un nouveau problème viens à moi, toujours dans le même script.
J'ai insérer un paramètre, que l'utilisateur doit renseigné en lançant le script, qui permet de vérifier si le nombre de type de données sont présents.
C'est-à-dire que si l'utilisateur tape "6", dans le champs du nouveau paramètre, alors le script doit vérifier si 6 types de donnée sont bien présents.
Exemple :
01 = bonbon rouge
01 = bonbon rouge
02 = bonbon vert
03 = bonbon rose
03 = bonbon rose
Dans le cas présent, si l'utilisateur tape 3, alors la vérification a réussi. Puisque 3 types de donnée sont présents.
Pour rappel : les types de donnée, comme dans l'exemple ci-dessus, sont présent en tout début de chaque ligne.
Je ne sais pas comment m'y prendre, puisqu'il y a plusieurs types de même donnée.
Dernière modification par McRbt (Le 30/05/2014, à 16:39)
Hors ligne
#21 Le 30/05/2014, à 22:22
- Postmortem
Re : Script : analyse et traitement fichier .csv
Salut,
En supposant que le type de données est le 1er champ et que les champs sont séparés par des points-virgules :
awk -F ';' '!nb[$1]++{i++}END{print i}' fichier
J'ai pas testé !
Édit :
En regardant la dernière version du script que tu as posté, on voit que tu lis le fichier de départ plusieurs fois. Sur un petit fichier, ce n'est pas très grave mais sur un plus gros...
Tu comptes le nombre de lignes grâce à sed, tu vérifies avec awk que c'est le bon nombre de lignes qui est renseigné dans le fichier puis tu traites le fichier. Ça fait déjà 3 lectures du fichier.
Si tu rajoutes la vérification du nombre de types de données, ça fera 4 passes sur le fichier ; ça fait beaucoup !
Tu pourrais tout faire d'un coup avec awk.
Déjà, pour le nombre de lignes, un seul awk suffit par exemple :
awk -F, '/^99,/{print "Nombre de lignes indiquées dans le fichier : " $2} END{print "Nombre de lignes du fichier : " NR}' "$FULL_FILE_NAME_IN"
On pourrait aussi y inclure la vérification du nombre de type de données.
Ça ferait les 3 vérifications en un seul passage plutôt que 3.
Dernière modification par Postmortem (Le 31/05/2014, à 02:06)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#22 Le 02/06/2014, à 10:18
- McRbt
Re : Script : analyse et traitement fichier .csv
Postmortem,
awk -F ';' '!nb[$1]++{i++}END{print i}' fichier
J'ai pas testé !
A merveille ! C'est exactement ce qu'il me fallait.
Tu pourrais tout faire d'un coup avec awk.
Déjà, pour le nombre de lignes, un seul awk suffit par exemple :awk -F, '/^99,/{print "Nombre de lignes indiquées dans le fichier : " $2} END{print "Nombre de lignes du fichier : " NR}' "$FULL_FILE_NAME_IN"
On pourrait aussi y inclure la vérification du nombre de type de données.
Ça ferait les 3 vérifications en un seul passage plutôt que 3.
Si c'est faisable, ca m'intéresse énormément. Cependant, même en un seul commande, est-ce possible de décelé une erreur ? Si on fait tout ceci en une seule commande, le script s'arrêtera-t-il si une des vérifications a échoué ?
Merci.
Dernière modification par McRbt (Le 02/06/2014, à 10:19)
Hors ligne