Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

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 12/07/2022, à 21:47

headstorm

Script Bash/ parcours tableau avec variable

Bonjour à tous,

Je viens vers vous aujourd’hui pour vous demander un petit coup de pouce, je suis bloqué sur un script bash;

Je m’explique:

je fais des traitements de fichiers grâce a leurs noms en les comparant à une liste contenue dans un fichier différent, le format du nom de fichier est de type suivant:
dossier_année_mois_nom_prénom_serial.pdf

je récupère tous les éléments dans un tableau après avoir enlevé l’extension et remplacé les « _ » par des espaces.
mon problème est que la partie nom et prénom peuvent contenir plusieurs mots et je cherche à parcourir le tableau et a extraire les mots correspondants

voici mon code:

for n in *.pdf; do
f="$(basename "$n" .pdf)"     # enleve le chemin et l'extension du fichier
tbl=( ${f//_/\ } )           # remplce "_" par des espaces et mets dans un tableau
fin=${#tbl[@]}               # compte le nombre d'enregistrement dans le tableau    
fi=$((fin-1))    # fin du tableau en enlevant le serial

while IFS=, read -r first last mail; do # parcours le fichier csv 
if [ "${first^^}" == "${tbl[3]^^}" ] && [ "${tbl[@]:4:$fi}" == "$last" ]; then  # si le nom contenu dans le fichier correspond à la partie nom du fichier et que la suite correspond au prénom..
nom="${first^^}"
prenom="${last^}"
fi
done <  /chemin/vers/mon/csv
done

ce code ne fonctionne pas il ne parcours pas le tableau du 4ème au dernier, je ne sais pas si c’est la bonne approche, parce que je dois dupliquer la condition en décalant de 1 si le nom comporte 2 mots…

je vous remercie de votre aide.

Dernière modification par headstorm (Le 12/07/2022, à 21:48)

Hors ligne

#2 Le 12/07/2022, à 22:11

Watael

Re : Script Bash/ parcours tableau avec variable

remplace, d'abord, par un caractère qui ne peut pas se trouver dans un nom de fichier : /
puis, quand tu as le nom et le prénom, tu remplaceras la barre oblique par un espace, pour faire la comparaison.


Welcome to sHell. · eval is evil.

En ligne

#3 Le 12/07/2022, à 22:17

headstorm

Re : Script Bash/ parcours tableau avec variable

Merci @watael pour la réponse.

je ne comprends pas bien la solution approtée, est-il possible d'en savoir plus?
j'ai peut etre mal exposé mon problème.

Hors ligne

#4 Le 12/07/2022, à 22:44

headstorm

Re : Script Bash/ parcours tableau avec variable

Merci @watael pour la réponse.

Watael a écrit :

remplace, d'abord, par un caractère qui ne peut pas se trouver dans un nom de fichier : /
puis, quand tu as le nom et le prénom, tu remplaceras la barre oblique par un espace, pour faire la comparaison.

je ne comprends pas bien la solution apportée, est-il possible d'en savoir plus?

j'ai peut etre mal exposé mon problème, dans le nom de fichier je ne connais pas le nombre de mots contenus dans le nom et le prenom, donc en cas de prenom composé mon traitement ne fonctionne pas.

je cherche donc a tester si le nom et le prénom sont identiques a ceux contenus dans la liste de mon fichier, pour faire mon traitement.

Hors ligne

#5 Le 12/07/2022, à 22:44

MicP

Re : Script Bash/ parcours tableau avec variable

Bonjour

Dans son message #1, headstorm a écrit :


je fais des traitements de fichiers grâce a leurs noms en les comparant à une liste contenue dans un fichier différent, le format du nom de fichier est de type suivant:
dossier_année_mois_nom_prénom_serial.pdf

mon problème est que la partie nom et prénom peuvent contenir plusieurs mots et je cherche à parcourir le tableau et a extraire les mots correspondants

Je ferai l'inverse : comparer les noms/prénoms existants dans le fichier csv aux noms des fichiers pdf
car dans ton fichier csv, les noms ou/et prénoms composés (par exemple : "Anne Sophie","De La Coquillette") sont bien dans des champs individuels <=> séparés par des virgules
et il te serait donc plus facile d'utiliser le fichier csv comme source pour reconstruire un nom de fichier pdf à rechercher.

Dernière modification par MicP (Le 12/07/2022, à 22:51)


Retour utilisable de commande
2.d  Le prompt final : permet de s'assurer que la commande est allée à son terme, permet de s'assurer que le retour de commande a été copié/collé dans son intégralité et fournit dans certains cas d'autres informations très importantes.
voir le message #42

Hors ligne

#6 Le 12/07/2022, à 22:56

Watael

Re : Script Bash/ parcours tableau avec variable

tu pourrais avoir ça : dossier_année_mois_nom1 nom2_prénom1 prénom2_serial.pdf, si j'ai bien compris
tu transformes en ça : dossier année mois nom1 nom2 prénom1 prénom2 serial.pdf, forcèment tu ne peux pas y retrouver l'information voulue, parce que le séparateur de champ est perdu.
je suggère de passer par ça : dossier/année/mois/nom1 nom2/prénom1 prénom2/serial.pdf
les noms et les prénoms sont alors toujours les quatrième et cinquième champs.

EDIT:
finalement, je ne suis même pas certain qu'une transformation soit nécessaire :

$ IFS='_.' read dir y m nom prenom serie ext <<<"dossier_année_mois_nom1 nom2_prénom1 prénom2_serial.pdf"
$ echo "$nom"
nom1 nom2
$ echo "$prenom"
prenom1 prenom2

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


Welcome to sHell. · eval is evil.

En ligne

#7 Le 12/07/2022, à 23:06

headstorm

Re : Script Bash/ parcours tableau avec variable

MicP a écrit :

Bonjour

Dans son message #1, headstorm a écrit :


je fais des traitements de fichiers grâce a leurs noms en les comparant à une liste contenue dans un fichier différent, le format du nom de fichier est de type suivant:
dossier_année_mois_nom_prénom_serial.pdf

mon problème est que la partie nom et prénom peuvent contenir plusieurs mots et je cherche à parcourir le tableau et a extraire les mots correspondants

Je ferai l'inverse : comparer les noms/prénoms existants dans le fichier csv aux noms des fichiers pdf
car dans ton fichier csv, les noms ou/et prénoms composés (par exemple : "Anne Sophie","De La Coquillette") sont bien dans des champs individuels <=> séparés par des virgules
et il te serait donc plus facile d'utiliser le fichier csv comme source pour reconstruire un nom de fichier pdf à rechercher.


Bonjour et merci de ce retour,

C'est bien comme ca que je prends le problème mais cela ne fonctionne pas, dans mon exemple, je compare le champ "first" qui correspond au champ nom de mon csv avec le champ 4 du nom de fichier qui correspond au nom (si celui-ci contient que 1 mot), je compare ensuite "last", qui correspond au champ prénom dans le CSV avec le reste des champs à partir de 5 jusqu'à la fin mais je pense que ma syntaxe ne doit pas est correcte.

Hors ligne

#8 Le 12/07/2022, à 23:12

headstorm

Re : Script Bash/ parcours tableau avec variable

Watael a écrit :

tu pourrais avoir ça : dossier_année_mois_nom1 nom2_prénom1 prénom2_serial.pdf, si j'ai bien compris
tu transformes en ça : dossier année mois nom1 nom2 prénom1 prénom2 serial.pdf, forcèment tu ne peux pas y retrouver l'information voulue, parce que le séparateur de champ est perdu.
je suggère de passer par ça : dossier/année/mois/nom1 nom2/prénom1 prénom2/serial.pdf
les noms et les prénoms sont alors toujours les quatrième et cinquième champs.

EDIT:
finalement, je ne suis même pas certain qu'une transformation soit nécessaire :

$ IFS='_.' read dir y m nom prenom serie ext <<<"dossier_année_mois_nom1 nom2_prénom1 prénom2_serial.pdf"
$ echo "$nom"
nom1 nom2
$ echo "$prenom"
prenom1 prenom2

Le nom du fichier est déja formé, il est reçu telquel, (exemple: dossier_année_mois_nom1_nom2_prénom1_prénom2_serial.pdf)
je ne peux donc pas isoler le nom et prénom dans le nom du fichier d'où la comparaison avec une liste de nom et prénom, en commençant par le fait que le nom contienne un mot, puis 2 ...
je déduis ensuite le prénom en me décalant de 1 dans le champ du fichier jusqu'au dernier pour en déduire le prénom.

je planche dessus depuis un petit moment et je seche..

Dernière modification par headstorm (Le 12/07/2022, à 23:17)

Hors ligne

#9 Le 12/07/2022, à 23:16

Watael

Re : Script Bash/ parcours tableau avec variable

je ne peux pas isoler le nom et prénom

je viens de te montrer le contraire pourtant.

montre-nous des exemples concrets de noms de fichiers (d'ailleurs, comment les "reçois"-tu ? ), ainsi qu'un échantillon représentatif fichier qui contient la liste à laquelle ils doivent être comparer, et dans lequel, bien sûr, figurera une correspondance.


Welcome to sHell. · eval is evil.

En ligne

#10 Le 12/07/2022, à 23:27

headstorm

Re : Script Bash/ parcours tableau avec variable

les fichiers sont formés par un logiciel tiers et sont envoyés sur une boite mail.

J'extrait ces fichiers avec uudeview et les place dans un dossier pour traitement, à partir de la différents scripts interviennent.

voici mon csv:

first, last, mail
DUPONT, Jean, jean.dupont@mail.tld
DE LA VEGA, Don Diego, dondiego.delavega@mail.tld

voici 2 fichiers pdf correspondants à mes enregistrements:

SOCIETEFICTIVE_2022_01_DUPONT_JEAN_0000001.pdf
SOCIETEFICTIVE_2022_01_DE_LA_VEGA_DON_DIEGO_000005.pdf

en testant que le nom ca fonctionne mais le traitement est faussé si 2 personnes ont le meme nom de famille

Hors ligne

#11 Le 13/07/2022, à 00:21

MicP

Re : Script Bash/ parcours tableau avec variable

Dans son message #7, headstorm a écrit :

…C'est bien comme ca que je prends le problème …

Non
car en fait, tu fais l'inverse de ce que je te proposais : tu utilises le nom du fichier pdf pour tenter de retrouver l'enregistrement dans le fichiers csv

=======
Mais de toutes façons, tu auras toujours un problème s'il existe, par exemple, dans ton fichier csv
des enregistrements ressemblant à ceux là :

DUPONT, Jean, jean.dupont@mail.tld
DUPONT, Jean Michel, jeanmichel.dupont@mail.tld
DUPONT JEAN, Michel, michel.dupontjean@mail.tld

Dernière modification par MicP (Le 13/07/2022, à 02:13)


Retour utilisable de commande
2.d  Le prompt final : permet de s'assurer que la commande est allée à son terme, permet de s'assurer que le retour de commande a été copié/collé dans son intégralité et fournit dans certains cas d'autres informations très importantes.
voir le message #42

Hors ligne

#12 Le 13/07/2022, à 04:39

Watael

Re : Script Bash/ parcours tableau avec variable

logiciel tiers "développé" par un tiers de cépagrav, un tiers de menbalek, et un tiers de stagiaire disparu ?

adieu séparateur de champs, adieu les données. sad
c'est comme si tu faisais fondre ensemble des billes colorées, et qu'on te demande de retrouver les rouges. hmm


Welcome to sHell. · eval is evil.

En ligne

#13 Le 13/07/2022, à 08:11

MicP

Re : Script Bash/ parcours tableau avec variable

Histoire vécue :
Un copain me demande de l’accompagner pour aller dépanner quelqu'un que je ne connaissais pas.
On y va, et une fois le dépannage terminé, comme il est 11:45, c'est l'heure de boire un petit jaune.
On va tous s’asseoir dans sa cuisine, il pose les verres, et je vois quoi sur la table : Mon carnet de chèque que je n'avais pas pris avec moi.
En fait, le gars était à la même banque que moi, dans la même agence bancaire, et il avait exactement le même nom et prénom que moi.

=======

watael a écrit :

c'est comme si tu faisais fondre ensemble des billes colorées, et qu'on te demande de retrouver les rouges. hmm

J'aime beaucoup l'image. big_smile

Dernière modification par MicP (Le 13/07/2022, à 08:17)


Retour utilisable de commande
2.d  Le prompt final : permet de s'assurer que la commande est allée à son terme, permet de s'assurer que le retour de commande a été copié/collé dans son intégralité et fournit dans certains cas d'autres informations très importantes.
voir le message #42

Hors ligne

#14 Le 13/07/2022, à 17:06

headstorm

Re : Script Bash/ parcours tableau avec variable

Bonjour

Watael a écrit :

logiciel tiers "développé" par un tiers de cépagrav, un tiers de menbalek, et un tiers de stagiaire disparu ?

adieu séparateur de champs, adieu les données. sad
c'est comme si tu faisais fondre ensemble des billes colorées, et qu'on te demande de retrouver les rouges. hmm

oui c'est un peu l'idéee mais je ne peux pas influer dessus, je dois faire avec, malheureusement...

Finalement j'ai contourné mon problème en partant du principe que le nom de famille ne contiendra pas plus de 4 mots et j'ai ensuite parcouru le tableau pour déduire le nombre de mots dans le prénom, voici mon code, je pense qu'il pourra être optimisé

 
tbl4="${tbl[@]:4:$((fi - 4))}"
    if [ "${first^^}" == "${tbl[3]^^}" ] && [ "${last^^}" == "${tbl4^^}" ]; then
    nom="${first^^}"
    prenom="${last^}"
    fi

tbl4="${tbl[@]:5:$((fi - 5))}"
    if [ "${first^^}" == "${tbl[3]^^} ${tbl[4]^^}" ] && [ "${tbl4[@]}" == "$last" ]; then
    nom="${first^^}"
    prenom="${last^}"				
    fi

... ## et ainsi de suite jusqu'à 4 mots dans le nom

c'est pas très propre j'avoue mais ca fonctionne.

Merci de votre temps smile

Dernière modification par headstorm (Le 13/07/2022, à 17:07)

Hors ligne

#15 Le 13/07/2022, à 20:27

Watael

Re : Script Bash/ parcours tableau avec variable

une proposition :

$ fic='dossier_année_mois_nom1 nom2_prénom1 prénom2_serial.pdf'
$ tmp="${fic#*_*_*_}" #on supprime dossier année mois
$ IFS='_' read -r noms prenoms <<< "${tmp%_*}" #on supprime tout depuis le dernier _ 
$ echo "$noms"
nom1 nom2

Welcome to sHell. · eval is evil.

En ligne