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 08/03/2019, à 13:59

Zethra

Concaténation de fichier .CSV ?

Bonjour,

Ayant posé une question sur un autre de mes sujets concernant cette problèmatique, on m'a conseillé d'ouvrir un nouveau sujet !


J'ai réussi, d'une manière plus ou moins propre, à extraire des données dans un fichier .csv en fonction d'informations se trouvant dans un autre fichier .csv. Concrètement, j'ai un fichier se présentant ainsi :

Lundi
Mardi
Mercredi
Jeudi
Vendredi

Il fallait que je puisse extraire les lignes d'un tableau en fonction de la liste des jours ci-dessus. En gros, le script devait prendre Lundi, analyser le .csv en étant à la recherche de ce mot et s'il tombait dessus, il devait extraire la ligne complète. Le tout devait recommencer automatiquement pour tous les jours. J'ai donc fait celà :

#!/bin/bash

nombre_ligne=`wc -l $1 | cut -c 1`
compteur_ligne=0
fichier=0
fichier_final=0

for ((i=0;i<=nombre_ligne;i++))
do
        test=$(awk -v compteur_ligne="$compteur_ligne" -F',' '(NR==compteur_ligne){print $0}' $1)
        awk -F',' '{print $1","$2","$15","$17}' $2 | grep $test >> /tmp/"$2_$fichier.csv"
        awk -F',' '{print $1","$2","$15","$17}' $3 | grep $test >> /tmp/"$3_$fichier.csv"
        compteur_ligne=$((compteur_ligne+1))
        fichier=$((fichier+1))

        #done
done

Je mets donc en premier paramètre mon fichier avec les mots clés, en deuxième et troisième paramètres les fichiers qui seront analysés à partir des mots du premier fichier. Dans mon exemple avec les jours, chaque jour entraîne la création d'un fichier .csv avec à l'intérieur les lignes dans lesquelles nous pouvons trouver un des mots clés. Donc s'il y a deux fichiers à analyser, il y aura donc deux fichier.csv pour Lundi avec les lignes contenants le mots lundi, deux pour mardi etc...
Vous pouvez aussi remarquer que je ne prends pas toutes les colonnes des tableaux, mais seulement la 1ère, la 2ème, la 15ème et la 17ème. Il faut savoir que les deux fichiers que j'analyse sont composés de la même manière.


Le but étant de pouvoir comparer, par exemple, le menu de ce Vendredi avec le menu de Vendredi dernier. Il faudrait donc pourvoir mettre dans un même fichier csv, les fichiers.csv contenant les lignes qui correspondent au Lundi, puis un autre avec Mardi etc...

Voilà la ligne que j'utilise pour se faire :

paste vendredi_semaine_dernière.csv <(echo) vendredi_cette_semaine.csv > vendredi_comparaison.csv 

Le "<(echo)" permet d'ajouter une colonne entre les deux fichiers qui seront fusionnés.


Manuellement ça fonctionne, mais il faudrait que je puisse intégrer ça dans ma boucle. Quand je mets cette commande à la suite de cette manière :

nombre_ligne=`wc -l $1 | cut -c 1`
compteur_ligne=0
fichier=0
fichier_final=0

for ((i=0;i<=nombre_ligne;i++))
do
        test=$(awk -v compteur_ligne="$compteur_ligne" -F',' '(NR==compteur_ligne){print $0}' $1)
        awk -F',' '{print $1","$2","$15","$17}' $2 | grep $test >> /tmp/"$2_$fichier.csv"
        awk -F',' '{print $1","$2","$15","$17}' $3 | grep $test >> /tmp/"$3_$fichier.csv"
        compteur_ligne=$((compteur_ligne+1))
        fichier=$((fichier+1))


        paste /tmp/$2_$fichier.csv <(echo) /tmp/$3_$fichier.csv >> /tmp/$fichier_final.csv
        fichier_final=$((fichier_final+1))
        
done

Plusieurs problèmes surviennent :

- Tout d'abord des " such file or not directory " sur mes fichiers .csv créés alors qu'ils existent bien !
- Je suis obligé de lancer deux fois le script pour que ça fonctionne ! Mais sinon... ça fonctionne ! lol


De ce fait, si on se base sur l'exemple avec les jours, il faudrait 5 fichiers.csv, 1 fichier contenant les deux lundis, 1 autres avec les deux mardis etc...

Mais ce n'est pas tout ! Il faut ensuite que je fusionne ces 5 fichiers.csv en un seul ! Là encore j'ai trouvé la commande qui va bien :

 paste Lundi.csv ; echo""; echo""; paste Mardi.csv ; echo""; echo""; paste Mercredi.csv; echo""; echo""; paste Jeudi.csv; echo""; echo ""; paste Vendredi.csv; echo ""; echo ""; echo) > VersionFinal.csv

La commande est longue, mais fonctionne parfaitement ! Les " echo"" " représentent les lignes que je veux laisser entre chaque fichiers.csv concaténés :

Lundi Lundi Lundi Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi Lundi Lundi Lundi
                                            <-- echo ""
                                            <-- echo ""
Mardi Mardi Mardi Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi Mardi Mardi Mardi

etc...

Voilà un petit peu où j'en suis... Auriez-vous une idée pour intégrer dans ma boucle la concaténation de deux fichiers.csv puis pour créer le fichier final ?


Mon code doit être assez " crade ", je suis débutant, donc n'hésitez pas à me taper sur les doigts et à ma corriger quand il le faut !


Merci d'avance ! smile

Hors ligne

#2 Le 09/03/2019, à 06:39

pingouinux

Re : Concaténation de fichier .CSV ?

Bonjour,
Tu devrais regarder la commande join. Il serait bien que tu donnes un exemple de fichiers permettant de faire des tests.

Hors ligne

#3 Le 09/03/2019, à 09:50

diesel

Re : Concaténation de fichier .CSV ?

Zethra a écrit :

Bonjour,

Je suis débutant, donc n'hésitez pas à me taper sur les doigts et à me corriger quand il le faut !


Merci d'avance ! smile

Demande à Watael. wink big_smile big_smile big_smile

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 09/03/2019, à 09:50)


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

En ligne

#4 Le 09/03/2019, à 10:46

Watael

Re : Concaténation de fichier .CSV ?

je suis sur le coup wink dans la discussion précédente, parce que, dès le départ, c'est mal engagé.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne