#1 Le 07/03/2019, à 10: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 ! ) :
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 !
Dernière modification par Zethra (Le 08/03/2019, à 13:32)
Hors ligne
#2 Le 07/03/2019, à 10: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, à 11: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
Dernière modification par Watael (Le 07/03/2019, à 11:29)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#4 Le 07/03/2019, à 11: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, à 11: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, à 11:28
- Watael
Re : [RESOLU] Question concernant les CSV !
oops. grr. c'est tail ! pas head.
j'édite.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#6 Le 07/03/2019, à 11:30
- diesel
Re : [RESOLU] Question concernant les CSV !
oops. grr. c'est tail ! pas head.
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, à 11: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, à 11:37)
Hors ligne
#8 Le 07/03/2019, à 11: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, à 11: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.
En ligne
#10 Le 08/03/2019, à 11: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 !
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 !
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 ?
Dernière modification par Zethra (Le 08/03/2019, à 11:56)
Hors ligne
#11 Le 08/03/2019, à 12: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.
En ligne
#12 Le 08/03/2019, à 13: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, à 14:34
- Watael
Re : [RESOLU] Question concernant les CSV !
tout le script est une mauvaise pratique.
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.
En ligne
#14 Le 08/03/2019, à 15: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, à 15:10)
Hors ligne
#15 Le 08/03/2019, à 17: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.
En ligne
#16 Le 08/03/2019, à 18:54
- Zethra
Re : [RESOLU] Question concernant les CSV !
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, à 19: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.
En ligne