Compter les mots d'un fichier

moderno31

Membre expert
Club iGen
21 Avril 2011
1 389
107
Salzbourg
Bonjour,

J'ai besoin de compter dans plusieurs fichiers Excel le nombre de mots qui sont trouvés.
Par exemple avoir un résultat comment :
- Formation = 16
- Licence = 2
- Spécifications fonctionnelles (compte pour 1 mot) : 6

Je pense à Automator. Auriez-vous une autre idée pour moi ?

Merci
 
Dans Excel, tu peux le faire simplement avec une astuce : tu lances une recherche sur le mot ou l'expression voulue et tu demandes à remplacer par la même chose. Tu cliques sur "Remplacer tout" et il te répond "Excel a remplacé xx instances" :

Capture d’écran.webp

Sinon, si le mot recherché est toujours seul dans les cellules (et pas n'importe où dans le contenu des cellules), tu peux aussi le faire dans une feuille de calcul avec la fonction =NB.SI(). Par exemple en saisissant la formule =NB.SI(C:C;"=Restau") dans une cellule, j'obtiens le nombre de cellules contenant le mot "Restau" dans la colonne C :

Capture d’écran 1.webp
Selon le besoin, on peut encore sophistiquer un peu (mais tant qu'à faire, précise ce que tu veux exactement obtenir, la version d'Excel concernée, etc.)
 
un grep en shell ? :D
 
un grep en shell ?
À supposer que soit lisible a priori un fichier "source" intitulé par exemple docu.txt et localisé (toujours en exemple) sur le Bureau, alors une commande grep assortie d'un pipe simple :
Bloc de code:
grep -o 'pattern' Desktop/docu.txt | wc -l
retourne le nombre exact d'occurences de 'pattern' (un mot choisi, ou un caractère, ou encore une expression) dans le fichier.

Mais si l'on aime mieux se compliquer la vie avec awk (par exemple), alors une commande :
Bloc de code:
awk -F 'pattern' '{ if ( NF > 0 ) n += NF - 1 }; END { print n }' Desktop/docu.txt
produirait le même résultat.

À supposer qu'il y ait plus d'un fichier, soit toujours en exemple docu.txt et fichier.rtf sur le Bureau, alors il suffirait de les aligner en cibles de grep ainsi :
Bloc de code:
grep -o 'pattern' Desktop/docu.txt Desktop/fichier.rtf | wc -l
ou pareillement dans la variante awk ainsi :
Bloc de code:
awk -F 'pattern' '{ if ( NF > 0 ) n += NF - 1 }; END { print n }' Desktop/docu.txt Desktop/fichier.rtf

Mais pour l'amateur de trombones rallonges à coulisses, il serait encore possible de partir d'un cat préalable qui refilerait le flux de lecture des fichiers par un premier pipe à grep ainsi :
Bloc de code:
cat Desktop/docu.txt Desktop/fichier.rtf | grep -o 'pattern' | wc -l
ou dans la variante awk ainsi :
Bloc de code:
cat Desktop/docu.txt Desktop/fichier.rtf | awk -F 'pattern' '{ if ( NF > 0 ) n += NF - 1 }; END { print n }'

Mais comme remarqué par luc1en :
ça fonctionnerait dans un fichier au format propriétaire tel que xlsx ? Spotlight trouve des chaînes de caractère, mais est-ce qu'il fonctionne sur la base de grep ?
=> zéro pointé avec un fichier excel .xlsx qui n'est pas lisible en "source". Mieux vaut donc recourir au procédé de Bernard (aka: Aliboron) :coucou:
 
  • J’aime
Réactions: melaure
Bonjour,
un fichier excel .xlsx qui n'est pas lisible en "source".
le format .xlsx est en effet un conteneur. Ouvert avec un éditeur de texte, voici ce qui s'affiche
upload_2016-6-23_8-16-35.webp

D'après ce que j'ai compris, parcourir le contenu de ce type de “fichier” nécessite de causer en néo klingon XML.
 
Ce n'est pas bien compliqué le XML, et c'est facilement "parsable" ;)
 
Tout juste. Les fichiers XML sont en général du texte (pour les .xlsx, codé en l'UTF-8) donc on peut compter aisément les occurences d'un mot qu'ils contiennent.
À mon avis, on aurait alors intérêt à utiliser un script bien écrit (en Perl, Python, Ruby : tout ceci est installé par défaut sur les Macs).

[Edith]En fait, j'avais oublié l'option -c de unzip.
En tapant :
Bloc de code:
unzip -c monfichier.xlsx | awk -F 'pattern' '{ if ( NF > 0 ) n += NF - 1 }; END { print n }'
on doit commencer à y arriver.
Sauf si les fins de ligne ne sont pas corrects.
 
Dernière édition:
Ça marche effectivement (je viens de le vérifier) => le premier segment de commande introduit par bompi :
Bloc de code:
unzip -c monfichier.xlsx
permet bien de piper du texte lisible à awk, ce qui fait que la commande complète de son message #8 est valide pour un fichier excel isolé :
Bloc de code:
unzip -c monfichier.xlsx | awk -F 'pattern' '{ if ( NF > 0 ) n += NF - 1 }; END { print n }'


À supposer qu'on veuille à présent compter des occurences en prenant pour source un lot de fichiers .xlsx (et pas un seul fichier), une astuce commode serait de commencer par logger tous ces fichiers dans un dossier créé ad-hoc - pour l'exemple un BROL sur le Bureau.

Alors, une simple commande :
Bloc de code:
cd Desktop/BROL
commencerait par logger l'opérateur dans l'espace du dossier BROL > ce qui permettrait d'enchaîner par la commande légèrement adaptée :
Bloc de code:
unzip -c '*xlsx' | awk -F 'pattern' '{ if ( NF > 0 ) n += NF - 1 }; END { print n }'
et l'on obtiendrait le résultat demandé, unzip commençant par traiter tous les éléments terminés par l'extension .xlsx de l'espace d'opération (comme s'il s'agissait du contenu d'une archive) pour les piper ensemble à awk qui n'a plus qu'à compter les occurrences de 'pattern'.
 
  • J’aime
Réactions: Aliboron