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 07/03/2019, à 11:13

Zethra

[RESOLU] Question concernant les CSV !

Bonjour,

Je dois traiter plusieurs CSV et j'aimerais vos conseils/votre aide sur ce que je fais !

Pour des questions de "confidentialité ", je ne pourrais pas copier exactement les lignes de mon CSV, mais je tacherais de vous donner des exemples ressemblants !

J'ai extrais une colonne d'un fichier .xlsm pour ensuite les mettre dans un fichier.csv. Voici comment se présente le fichier :

Jours de la semaine
Lundi
Mardi
Mercredi
Jeudi
Vendredi

Ma question est la suivante : Chaque jour de la semaine est une valeur que je dois vérifier dans un autre fichier.csv. Si, dans une des lignes du tableau, on trouve la valeur en question, il faut extraire la ligne complète et la mettre dans un autre fichier.csv. Il faut ensuite passer à la seconde valeur, vérifier que cette valeur existe, si c'est le cas, on extrait la ligne complète dans laquelle se trouve la valeur, on l'envoie dans un autre fichier.csv etc... Donc dans mon exemple avec les jours, il faudrait vérifier manuellement Lundi, puis Mardi, puis Mercredi...


J'ai fais un petit script qui fait ça automatiquement, mais qui n'est pas super pratique ( et pas très propre aussi, mais bon, je débute ! lol ) :

while true
do
                read -p " Jour : " saisie

                if [ $saisie == "q" ]
                then
                        echo " Goodbye ! "
                        exit

                else
                        read -p " Nom du fichier : " nom
                fi
                        if [ $nom == "q" ]
                        then
                                echo " Goodbye ! "
                                exit
                        else

                                cat $1 | grep $saisie  >> /tmp/$nom.csv
        fi
done

Le résultat est le suivant, en fonction du jour que je demande au début de mon script :

23,61224,461210,18ytu,g,TIOP,none,none,activé,activé,none,none,23,,Jeudi,21,poire,0
98,61224,19,18ytu,g,TIOP,none,none,non activé,activé,none,ok,23,,Mercredi,21,pomme,0
72,8086434,461210,18ytu,g,TIOP,none,none,activé,activé,ok,none,23,,Lundi,21,Fraise,0

Il faut savoir que sauf la colonne j'ai pu extraire avec la liste des jours, tous les autres fichier.csv sont composés de la même manière, donc comme mon résultat.


Donc fabuleux, ça fonctionne ! Mais maintenant j'aimerai savoir s'il était possible d'utiliser mon premier fichier.csv avec ma liste de jour en premier paramètre, en deuxième paramètre le fichier.csv à analyser et que ça scan tout seul le fichier avec la première valeur de mon fichier.csv en premier paramètre ( donc ici lundi ), que si cette valeur a été trouvé, extraire les lignes complètes dans un fichier1.csv puis que ça passe à mardi si jamais il n'y a pas plus de Lundi et que ça recommence avec Mardi etc...

Je suppose qu'il faut utiliser une boucle while, mais je n'arrive pas à visualiser comment prendre la valeur lundi pour scanner tout le fichier, puis passer à Mardi etc...


Pourriez-vous m'aider ?


Merci d'avance ! smile

Dernière modification par Zethra (Le 08/03/2019, à 14:32)

Hors ligne

#2 Le 07/03/2019, à 11:46

diesel

Re : [RESOLU] Question concernant les CSV !

Je peux te proposer ça :

jean-marie@jean-marie:~$ cat titi.sh
sed -i '/Lundi/s/^/1 /' $1
sed -i '/Mardi/s/^/2 /' $1
sed -i '/Mercredi/s/^/3 /' $1
sed -i '/Jeudi/s/^/4 /' $1
sed -i '/Vendredi/s/^/5 /' $1
sed -i '/Samedi/s/^/6 /' $1
sed -i '/Dimanche/s/^/7 /' $1
sort -n $1 | sed 's/^..//'
sed -i 's/^..//' $1
jean-marie@jean-marie:~$ cat toto
23,61224,461210,18ytu,g,TIOP,none,none,activé,activé,none,none,23,,Jeudi,21,poire,0
98,61224,19,18ytu,g,TIOP,none,none,non activé,activé,none,ok,23,,Mercredi,21,pomme,0
72,8086434,461210,18ytu,g,TIOP,none,none,activé,activé,ok,none,23,,Lundi,21,Fraise,0
98,61224,19,18ytu,g,TIOP,none,none,non activé,activé,none,ok,23,,Mercredi,21,pomme,0
72,8086434,461210,18ytu,g,TIOP,none,none,activé,activé,ok,none,23,,Lundi,21,Fraise,0
jean-marie@jean-marie:~$ ./titi.sh toto
72,8086434,461210,18ytu,g,TIOP,none,none,activé,activé,ok,none,23,,Lundi,21,Fraise,0
72,8086434,461210,18ytu,g,TIOP,none,none,activé,activé,ok,none,23,,Lundi,21,Fraise,0
98,61224,19,18ytu,g,TIOP,none,none,non activé,activé,none,ok,23,,Mercredi,21,pomme,0
98,61224,19,18ytu,g,TIOP,none,none,non activé,activé,none,ok,23,,Mercredi,21,pomme,0
23,61224,461210,18ytu,g,TIOP,none,none,activé,activé,none,none,23,,Jeudi,21,poire,0
jean-marie@jean-marie:~$ cat toto
23,61224,461210,18ytu,g,TIOP,none,none,activé,activé,none,none,23,,Jeudi,21,poire,0
98,61224,19,18ytu,g,TIOP,none,none,non activé,activé,none,ok,23,,Mercredi,21,pomme,0
72,8086434,461210,18ytu,g,TIOP,none,none,activé,activé,ok,none,23,,Lundi,21,Fraise,0
98,61224,19,18ytu,g,TIOP,none,none,non activé,activé,none,ok,23,,Mercredi,21,pomme,0
72,8086434,461210,18ytu,g,TIOP,none,none,activé,activé,ok,none,23,,Lundi,21,Fraise,0
jean-marie@jean-marie:~$

Amicalement.

Jean-Marie


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.

Hors ligne

#3 Le 07/03/2019, à 12:16

Watael

Re : [RESOLU] Question concernant les CSV !

ouah ! 8O

grep -f <(tail -n +2 fichierJours) fichier.csv >autre.csv

edit: from head to tail wink

Dernière modification par Watael (Le 07/03/2019, à 12:29)


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

Hors ligne

#4 Le 07/03/2019, à 12:26

diesel

Re : [RESOLU] Question concernant les CSV !

Ben...,

Ça marche pô. Ça sort que les lundis. Mais je suis impressionné (comme d'hab.)

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 07/03/2019, à 12:27)


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.

Hors ligne

#5 Le 07/03/2019, à 12:28

Watael

Re : [RESOLU] Question concernant les CSV !

oops. grr. c'est tail ! pas head. sad

j'édite.


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

Hors ligne

#6 Le 07/03/2019, à 12:30

diesel

Re : [RESOLU] Question concernant les CSV !

Watael a écrit :

oops. grr. c'est tail ! pas head. sad

j'édite.

Mais juste en remplaçant "head" par "tail", ça marche pas du tout.

Amicalement.

Jean-Marie


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.

Hors ligne

#7 Le 07/03/2019, à 12:34

pingouinux

Re : [RESOLU] Question concernant les CSV !

Bonjour,

$ cat mon_script.sh 
while read jour
do
   grep -w "$jour" "$2"
done <"$1" >"$3"

ou si tu veux sauter la première ligne du fichier des jours

$ cat mon_script.sh 
while read jour
do
   grep -w "$jour" "$2"
done < <(tail -n +2 "$1") >"$3"

À appeler ainsi

./mon_script.sh jours.txt fichier.csv resul

Édité : Corrections

Dernière modification par pingouinux (Le 07/03/2019, à 12:37)

Hors ligne

#8 Le 07/03/2019, à 12:43

pingouinux

Re : [RESOLU] Question concernant les CSV !

La réponse de Watael #3 me paraît la meilleure, mais j'aurais quand même fait

grep -wf ...

Hors ligne

#9 Le 07/03/2019, à 12:46

Watael

Re : [RESOLU] Question concernant les CSV !

oui, je n'y pense pas, bien sûr -w.
merci.


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

Hors ligne

#10 Le 08/03/2019, à 12:51

Zethra

Re : [RESOLU] Question concernant les CSV !

Merci pour vos réponses !

Je vais étudier vos propositions, mais j'aimerais terminer la mienne avant ! smile


Voilà ce que j'ai essayé de faire :

#!/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

Ça me donne les fichiers dont j'ai besoin ! Le problème c'est que maintenant, il faut que je puisse coller les entre eux les fichiers qui vont ensemble. Donc par exemple, j'ai le .csv contenant le menu de ce jeudi et j'ai le .csv contenant le menu de jeudi dernier, j'aimerais pouvoir coller les deux dans un seul et même fichier !

Manuellement, j'arrive à le faire :

paste fichier1.csv <(echo) fichier2.csv > fichier3;csv 

Le "<(echo)" permet d'ajouter une colonne entre les deux fichiers collés !


Le truc maintenant c'est le faire avec tous les fichiers... Voilà ce que j'ai ajouté dans mon code :

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
done

Mais plusieurs problème :
- tout d'abord des " such file or not directory " sur mes fichiers .csv créés alors qu'ils existent bien !

paste: /tmp/Monfichier.csv_1.csv: No such file or directory

- Je suis obligé de lancer deux fois le script pour que ça fonctionne ! Mais sinon... ça fonctionne ! lol


Au final, je vais devoir envoyer les fichiers .csv qui contiennent les deux autres fichiers précédemment collés dans un seul et unique fichier... J'arrive à leur manuellement, comme d'habitude :

( paste fichier1.csv ; echo""; echo""; paste fichier2.csv ;echo ) > Final.csv

Les " echo"" " représentent des lignes vides ajoutés entre les différents éléments collés...


Voilà un peu l'idée... Je me casse la tête pour rien, non ? roll

Dernière modification par Zethra (Le 08/03/2019, à 12:56)

Hors ligne

#11 Le 08/03/2019, à 13:30

Watael

Re : [RESOLU] Question concernant les CSV !

j'aimerais terminer la mienne avant

il ne faut pas.
tu regroupes en un script de nombreuses mauvaises pratiques.
cela "noie" le fonctionnement du script.

pour toi, c'est la suite de ton travail, pour nous c'est une nouvelle question.
ce sujet portait sur "trouver les correspondances dans un fichier à partir d'un autre", tu devrais éditer le sujet du forum.
ta nouvelle question porte la "concaténation horizontale de fichiers", tu devrais ouvrir un nouveau sujet.


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

Hors ligne

#12 Le 08/03/2019, à 14:32

Zethra

Re : [RESOLU] Question concernant les CSV !

Je comprends !

Étant débutant, je ne vois pas forcément où sont ces mauvaises pratiques !

Je vais donc passer ce sujet en résolu et en ouvrir un autre du coup !


Merci encore à vous !

Hors ligne

#13 Le 08/03/2019, à 15:34

Watael

Re : [RESOLU] Question concernant les CSV !

tout le script est une mauvaise pratique. hmm
un fichier se lit avec une boucle de type while read.
on n'utilise pas des commandes externes (surtout plusieurs fois) que le shell peut remplacer/imiter.
etc. etc.


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

Hors ligne

#14 Le 08/03/2019, à 16:09

Zethra

Re : [RESOLU] Question concernant les CSV !

Effectivement...

Ça m'apprendra à ne pas vous lire complètement tout de suite !

#!/bin/bash

while read jour
do
        awk -F',' '{print $1","$2","$15","$17}' "$2" | grep -w "$jour"
        echo""
        echo""

done <"$1" >"$3"


while read jour
do
        awk -F',' '{print $1","$2","$15","$17}' "$4" | grep -w "$jour"
        echo ""
        echo ""

done <"$1">"$5"

paste -d, $3 <(echo) $5 > FINAL.csv
 

Je ne sais pas si vous trouvez ça moins mauvais, mais en tout cas, c'est tellement plus rapide !

Dernière modification par Zethra (Le 08/03/2019, à 16:10)

Hors ligne

#15 Le 08/03/2019, à 18:24

Watael

Re : [RESOLU] Question concernant les CSV !

pourquoi ne pas avoir adopté la solution qu'on t'a proposée ?

grep -wf fic1 fic2 >fic3

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

Hors ligne

#16 Le 08/03/2019, à 19:54

Zethra

Re : [RESOLU] Question concernant les CSV !

Watael a écrit :

pourquoi ne pas avoir adopté la solution qu'on t'a proposée ?

grep -wf fic1 fic2 >fic3

Elle fonctionne aussi, mais c'est une simple question de présentation. Le résultat est :

Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi
Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi
Mercredi Mercredi Mercredi Mercredi
Mercredi Mercredi Mercredi Mercredi
Mercredi Mercredi Mercredi Mercredi
Mercredi Mercredi Mercredi Mercredi

Or, j'ai besoin de cela :

Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi
Lundi Lundi Lundi Lundi

Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi
Mardi Mardi Mardi Mardi

Mercredi Mercredi Mercredi Mercredi
Mercredi Mercredi Mercredi Mercredi
Mercredi Mercredi Mercredi Mercredi
Mercredi Mercredi Mercredi Mercredi

Je ne vois pas comment ajoute des espaces avec cette commande. Le echo dans la boucle while fut mon premier réflexe.

Hors ligne

#17 Le 08/03/2019, à 20:13

Watael

Re : [RESOLU] Question concernant les CSV !

grep -wf fic1 fic2 > fic3
while read l ine; do if test -n "$prev"; then test "$prev" != "$l" && fmt='%s\n\n' || fmt='%s\n'; fi; printf "$fmt" $prev; prev="$l";  done <fic3 echo "$prev"

ce n'est pas parfait.
c'est juste pour te montrer la voie.


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

Hors ligne