Filter des fichiers csv

Bonjour

j’ai plusieurs centaines de fichiers csv qui sont crée avec un logiciel.
chaque jour j’ai un fichier nommé 2013.12.nn.csv donc 2013.12.20.csv, 2013.12.21.csv etc.
je produis des rapports à partir de ces fichiers csv et il se trouve que je peux avoir besoin de plusieurs lignes dans différents fichiers.
j’utilise cette commande simple en sortie pour récupérer les fichiers dans un nouveau fichier.txt

Mes fichiers

-rw------- 2 nixman nixman 43379 oct. 1 23:59 2013-10-01.csv
-rw------- 2 nixman nixman 45885 oct. 2 23:57 2013-10-02.csv
-rw------- 2 nixman nixman 47609 oct. 3 23:59 2013-10-03.csv
-rw------- 2 nixman nixman 129139 oct. 4 23:53 2013-10-04.csv
-rw------- 2 nixman nixman 47612 oct. 5 23:59 2013-10-05.csv
-rw------- 2 nixman nixman 43983 oct. 6 23:59 2013-10-06.csv
-rw------- 2 nixman nixman 45340 oct. 7 23:59 2013-10-07.csv
-rw------- 2 nixman nixman 47645 oct. 8 23:59 2013-10-08.csv
-rw------- 2 nixman nixman 45121 oct. 9 23:59 2013-10-09.csv
-rw------- 2 nixman nixman 66196 oct. 10 23:00 2013-10-10.csv

Commandes :

cat 2013-10-0* | egrep “Spot Femme|Spot Homme” | cut -d: -f1-4,6

résultat :

09:01:35;;"[8] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
06:28:07;;”[142] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3"
08:10:13;;”[182] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
11:56:45;;”[4] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3"
06:29:47;;”[107] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
11:58:01;;”[23] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3"
06:30:04;;”[39] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
08:12:47;;”[62] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
11:55:39;;”[19] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3”

problème 1

pouvoir inserer la date du fichier csv dans le fichier de sorti
cat 2013-10-0* | egrep “Spot Femme|Spot Homme” | cut -d: -f1-4,6 > files_output.txt

résultat attendu

2013-10-01;09:01:35;;"[8] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
2013-10-04;06:28:07;;”[142] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3"
2013-10-06;08:10:13;;”[182] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
2013-10-06;11:56:45;;”[4] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3"
2013-10-08;06:29:47;;”[107] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
2013-10-08;11:58:01;;”[23] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3"
2013-10-08;06:30:04;;”[39] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
2013-10-09;08:12:47;;”[62] Spot Femme";“D:\Comm\Spots\Spot Femme.MP3"
2013-10-09;11:55:39;;”[19] Spot Homme";“D:\Comm\Spots\Spot Homme.MP3”

problème 2

peut on avoir une plage de recherche avec la commande cat ? si oui comment faire .
exemple cat 2013-[10-12]-0* pour dire de octobre à décembre et du 1er au 9

merci

Fais une boucle:

for file in * ; do
    date=$(echo $file | sed 's/\.csv^$//')
    cat $file | egrep "Spot Femme|Spot Homme" | cut -d: -f1-4,6 | sed "s/^/$date;/" >> files_output.txt
done

Pour le problème 2, bash peut utiliser des wildcards en précisant les caractères à matcher entre crochets, soit en les listant (ex: [123]), soit en prenant un intervalle (ex: [1-3]) donc tu peux remplacer :

par :

pour prendre de octobre à décembre et du 1er au 9.
Si tu as besoin de filtrer plus précisemment, tu peux rajouter un test (if) dans le script.

Merci pour la boucle.
Pourquoi utiliser “>>” dans le script et non “>” ? (juste comprendre )
A la fin du script j’ai la ligne
" cat $file | egrep “Spot Femme|Spot Homme” | cut -d: -f1-4,6 | sed “s/^/$date;/” >> files_output.txt "
Es ce normal ?

“commande >> fichier_cible” redirige la sortie de la commande en l’ajoutant à la fin du fichier_cible (si le fichier_cible n’existait pas il sera créé)

“commande > fichier_cible” redirige la sortie de la commande en créant le fichier_cible (remplace son contenu si le fichier_cible existait)

==========
Comme il s’agit d’une commande exécutée à l’intérieur d’une boucle “for”, si “>” avait été utilisé, le contenu du fichier cible serait “écrasé” à chaque bouclage.
Le fichier résultant ne contiendrait donc que le résultat du dernier appel de la commande dans la boucle.

la je comprends mieux
merci a vous

j’ai une erreur lorsque je veux filtrer sur le mois et les jours.

exemple du mois de octobre à décembre et du 1er au 31 du mois

for file in 2013.1[0-2].[0-3][1-9].csv ; do
date=$(echo $file | sed ‘s/.csv^$//’)
cat $file | egrep “Alpha Blondy” | cut -d: -f1-4,6 | sed “s/^/$date;/” >> Rapport_alpha.txt
done

resultat:
cat: 2013.1[0-2].[0-3][1-9].csv: Aucun fichier ou dossier de ce type

Ensuite je voudrai rechercher en ne tenant pas compte de la casse du nom. Avoir le resultat de “Alpha Blondy” ou “alpha blondy” ou aLpha BlonDy" etc dans le fichier.

Merci

Étant donné que:

-rw------- 2 nixman nixman 43379 oct. 1 23:59 2013-10-01.csv

il faudrait remplacer :

... for file in 2013.1[0-2].[0-3][1-9].csv ; do ...

par :

... for file in 2013-1[0-2]-[0-3][1-9].csv ; do ...

En résumé, dans tes noms de fichiers,

année, mois et jour sont séparés par un tiret “-” et pas par des points.

===========
j’ai ouvert un terminal,

j’ai entré: “/casse”, puis j’ai tapé sur la touche “entrée”,
ensuite je suis remonté une ligne au dessus, et ça donne:

...
-i, --ignore-case
              Ignorer la casse aussi bien dans le MOTIF  que  dans  les  fichiers.  (-i  est  une
              spécification POSIX.)
...

donc, il faudrait :

... cat $file | egrep -i "Alpha Blondy" | cut -d: -f1-4,6 | sed "s/^/$date;/" >> Rapport_alpha.txt ...

Bonjour,

Un truc qui pourrait t’aider, plutôt que :
cat 20* | egrep "Spot "
Tu peux faire
egrep -H "Spot " 20*

Cette dernière commande te renvoie le nom du fichier
au début de la ligne … tu peux donc récupérer la
date et ça peut éviter de faire la boucle …
On met le -H comme ça tu as le nom du fichier même
si un seul fichier matche.

Autre truc que je trouve bizarre, c’est le -d: alors
qu’il semble que le séparateur dans tes fichiers soit le ;
donc un -d";" serait plus approprié ?

Mets nous un extrait d’un fichier 20*csv pour mieux comprendre …

Merci pour votre soutien.

je reviens vers vous !
j’arrive a faire mes rapport avec les fichiers csv sans soucis.
je veux pouvoir faire des recherches sur des jours spécifiques comme chaque samedis des mois de novembre et décembre.
j’ai pu avoir une commande via l’irc freenode ( merci à Riviera )
touch 2013-11-{01…30}.csv; find . -type f -name ‘.csv’ -exec bash -c 'd=${1##/}; [[ $(date -d “${d%.csv}” +%u) = 6 ]]’ – {} ‘;’ -print | sort

cette commande crée les 30 fichiers du mois de novembre et recherche le sixieme jour de la semaine sur le mois soit le samedi.

##resultat##

./2013-11-02.csv
./2013-11-09.csv
./2013-11-16.csv
./2013-11-23.csv
./2013-11-30.csv

Voici le script pour mes rapport

###############################
for file in 201[3-4]-{$1,$2,$3}-[0-3][1-9].csv ; do
date=$(echo $file | sed ‘s/.csv^$//’)
cat $file | egrep -i “$4” | cut -d: -f1-4,6 | sed “s/^/$date;/” >> $5.csv
done
###########################
Avec les parametres positionnels ,
$1 = Juillet
$2 = Aout
$3 = Septembre
$4 = “chaine de caractere recherché”
$5 = nom du fichier en sorti.

je voudrai avec ces deux script rechercher cette fois ci une tranche horaire spécifique dans les fichiers csv.

exemple de 17h00 à 18h01mn:

17:00:48
17:01:11
17:13:05
17:13:35
17:15:59
17:16:41
17:40:36
17:41:06
17:41:26
17:53:51
17:54:21
17:56:04
17:56:20
17:56:57
17:59:32
18:00:38
18:00:50
18:01:03

je voudrai ressortir dans chaque fichier csv de chaque samedi des mois de juillet , Aout et septembre les lignes de 17h15 à 17h45 dans un fichier.

Merci de votre aide.

Merci à vous
avec cette commande je peux avoir le jour et l’heure souhaité

find . -type f -name ‘*.csv’ -printf ‘%Tw %P\0’ | while IFS=’’ read -r -d ‘’; do dow=${REPLY%% }; name=${REPLY#??} date=$(echo ${name%.} | sed ‘s/.csv^$//’); if (( dow == 6 )); then cat “$name”| egrep -i ‘^(17|18)’ | cut -d: -f1-4,6 | sed “s/^/$date;/”; fi; done

explication :
trouver tous les fichiers disponibles qui ont été créé le jours 6 de la semaine soit le samedi et chercher entre 17h00 et 18h59