Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ..

pingouinux a écrit :

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é.

pingouinux a écrit :

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,

pingouinux a écrit :

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 " " ?

pingouinux a écrit :

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.

pingouinux a écrit :

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,

pingouinux a écrit :

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.

pingouinux a écrit :

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,

Postmortem a écrit :
awk -F ';' '!nb[$1]++{i++}END{print i}' fichier

J'ai pas testé !

A merveille ! C'est exactement ce qu'il me fallait.

Postmortem a écrit :

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