extraire info d'un ensemble de fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

extraire info d'un ensemble de fichier

#1

Message par Dragor76 »

Bonjour,
Je me permet de vous solliciter pour mon projet de code
L'objectif est d'extraire un ou plusieurs numéros de chaque fichier txt d'un répertoire puis de noté sur un autre fichier txt.
Chaque numéros séparés par un espace et un saut de ligne entre chaque fichier lu
J'ai assemblé ça:

Code : Tout sélectionner

#include <file.au3>																					
#include <Excel.au3>

Global $cheminFichier =("C:\Users\Aurore\Desktop\...\txt acide")
$nbreFichier=_FileListToArrayRec($cheminFichier,"*", 1, 1, 0, 0)


;-------------------------------------------------------------------
For $i = 1 to $nbreFichier step 1
	
	;-------------------------------------------																;lit "No.-CAS" de la FDS
	Dim $CAS = "No.-CAS ", $text      											
	$filename = $nbreFichier
	$filename2 = 'recup.txt'
	;-------------------------------------------

	$file = FileOpen($filename, 0)													

	While 1																						
		$line = FileReadLine($file)																				
		If @error = -1 Then ExitLoop												

		If StringInStr($line, $CAS) Then																		
		   $text &= StringReplace($line, $CAS, "") & @CRLF											
		EndIf
	Wend

	FileWrite($filename2, $text)    													
	FileClose($filename)																

;-------------------------------------------																	;lit "CAS:" de la FDS
	$file = FileOpen($filename, 0)													

	While 1																						
		$line = FileReadLine($file)																				
		If @error = -1 Then ExitLoop												

		If StringInStr($line, $CAS) Then																		
		   $text &= StringReplace($line, $CAS, "") & @CRLF											;
		EndIf
	Wend

	FileWrite($filename2, $text)    													
	FileClose($filename)						

	;---------------------------------------------------														;SUPPRIME LES DOUBLONS
	Dim $aArray, $aNewArray
	;---------------------------------------------------
	_FileReadToArray($filename2, $aArray)
	_ArrayDelete($aArray, 0)
	$aNewArray = _ArrayUnique($aArray)
	_FileWriteFromArray($filename2, $aNewArray, 1)


	;---------------------------------------------------														;SUPPRIMER LETTRES
$newtext = StringRegExpReplace(FileRead($filename2), 'No.', "")
		
$file = FileOpen($filename2, 2)
FileWrite($file, $newtext)
FileClose($file)
Next
Sauf que ça ne marche pas
pouvez-vous me dire pourquoi ?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1028
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#2

Message par walkson »

Bonjour,
Je vous joints un code pour la méthode à utiliser. Les explications sont dans le code

Code : Tout sélectionner

#include <file.au3>
#include <Array.au3>
Global $cheminFichier = @DesktopDir
$arrayFichier =_FileListToArrayRec($cheminFichier,"*.txt", 1, 1, 0, 2) ;retourne un tableau la ligne 0 contient le NB de fichiers
_ArrayDisplay($arrayFichier);affiche l'array pour voir (à supprimer)
Local $Nligne = 1
For $i = 1 To $arrayFichier[0] ; de 1 au nombre de fichiers trouvé
	ConsoleWrite($arrayFichier[$i] & @CRLF);affiche le path du fichier (à supprimer)
	While 1
		$line = FileReadLine($arrayFichier[$i],$Nligne);lecture de la ligne
		If @error = -1 Then ExitLoop
		$Nligne += 1;on incrémente les lignes
		ConsoleWrite($line & @CRLF);le contenu à travailler
	WEnd

Next

Si je peux me permettre un conseil, utilisez les ConsoleWrite() et les _ArrayDisplay() qui permettent de visualiser les résultats. Éventuellement MsgBox(0,"ERROR",@error &" >> "& @extended) juste après une fonction. Vous pouvez les supprimer si c'est bon.
pour _FileReadToArray($filename2, $aArray)
_ArrayDelete($aArray, 0) c'est inutile
Mettre _FileReadToArray($filename2, $aArray) avec le flag $FRTA_NOCOUNT (0)
Idem pour $aNewArray = _ArrayUnique($aArray) avec le flag $iCount à $ARRAYUNIQUE_NOCOUNT (0) sinon vous allez copier le NB de lignes :D
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#3

Message par mikell »

ça serait quand même vachement plus simple pour répondre si on avait disons 2 ou 3 exemples des fichiers texte en question, avec l'info qu'on doit extraire de chaque fichier :roll:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#4

Message par Dragor76 »

ok je donne des exemples (pas exactement ceux du boulot mais équivalent)
https://www.merckmillipore.com/FR/fr/pr ... Origin=PDP
https://www.fishersci.fr/store/msds?par ... anguage=fr

Une fois transformé en doc.txt via pdftotxt je veux extraire les numéros CAS (j'ai pas prévu que ça marche pour absolument toutes les FDS mais j'adapterai mes filtres au fur et a mesure)
Modifié en dernier par Dragor76 le ven. 06 mai 2022 12:06, modifié 1 fois.
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#5

Message par Dragor76 »

Ok j'ai réussi a implémenté le code que vous m'avez donné.
Merci
Sur un test d'un dossier de 4 fichier txt j'ai sorti 2 numéros CAS, c'est pas mal
Pour lui faire chercher d'autres mots/orthographe: je dois recopier la partie "While 1...Wend" avec une autre valeur pour $CAS ou il existe de meilleurs méthodes ?

Code : Tout sélectionner

#include <file.au3>
#include <Array.au3>

Global $cheminFichier = @DesktopDir
$arrayFichier =_FileListToArrayRec($cheminFichier,"*.txt", 1, 1, 0, 2) ;retourne un tableau la ligne 0 contient le NB de fichiers

Local $Nligne = 1
Dim $CAS = "No.-CAS ", $text      											
	$filename2 = 'recup.txt'


For $i = 1 To $arrayFichier[0] ; de 1 au nombre de fichiers trouvé
	
	While 1
		$line = FileReadLine($arrayFichier[$i],$Nligne);lecture de la ligne
		If @error = -1 Then ExitLoop
		$Nligne += 1;on incrémente les lignes
		
	If StringInStr($line, $CAS) Then																		
		   $text &= StringReplace($line, $CAS, "") & @CRLF											
		EndIf
	Wend

	FileWrite($filename2, $text)    													

;-------------------------------------------																	;lit "CAS:" de la FDS

	;---------------------------------------------------														;SUPPRIME LES DOUBLONS
	Dim $aArray, $aNewArray
	;---------------------------------------------------
	_FileReadToArray($filename2, $aArray)
	_ArrayDelete($aArray, 0)
	$aNewArray = _ArrayUnique($aArray)
	_FileWriteFromArray($filename2, $aNewArray, 1)


	;---------------------------------------------------														;SUPPRIMER LETTRES
$newtext = StringRegExpReplace(FileRead($filename2), 'No.', "")
		
$file = FileOpen($filename2, 2)
FileWrite($file, $newtext)
FileClose($file)
Next
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2278
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#6

Message par jchd »

Il vaudrait mieux employer une expression régulière (regex) pour ça.
Quels sont les différents formats introduisant l'information recherchée ?

Exemple à fin de test, en agglomérant les données fournies :

Code : Tout sélectionner

Local $s = _
	"blah-blah 1" & @CRLF & _
	" xyz   No.-CAS        7647-01-0      (venant du premier exemple)" & @CRLF & _
	"blah-blah 2" & @CRLF & _
	"abc      Numéro CAS 143-33-9         (venant du second exemple)" & @CRLF & _
	"blah-blah 3" & @CRLF

; extraction
Local $a = StringRegExp($s, "(?:No.-CAS|Numéro CAS)\h+([\d-]+)", 3)
_ArrayDisplay($a)
On peut vouloir rajouter 'N° CAS' ou 'N. CAS' ou toute autre variante.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#7

Message par mikell »

Ou en bouclant sur une liste de .txt, qqe chose comme ça

$s = ""
; for ...
$txt = FileRead("machin.txt")
$info = StringRegExpReplace($txt, "(?s).*?(?:No.-CAS|Numéro CAS)\s*([\d-]+).*", "$1")
$s &= $info & @CRLF
; next
;Msgbox(0,"", $s)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#8

Message par Dragor76 »

jchd a écrit : ven. 06 mai 2022 18:39 Il vaudrait mieux employer une expression régulière (regex) pour ça.
Quels sont les différents formats introduisant l'information recherchée ?

Exemple à fin de test, en agglomérant les données fournies :

Code : Tout sélectionner

Local $s = _
	"blah-blah 1" & @CRLF & _
	" xyz   No.-CAS        7647-01-0      (venant du premier exemple)" & @CRLF & _
	"blah-blah 2" & @CRLF & _
	"abc      Numéro CAS 143-33-9         (venant du second exemple)" & @CRLF & _
	"blah-blah 3" & @CRLF

; extraction
Local $a = StringRegExp($s, "(?:No.-CAS|Numéro CAS)\h+([\d-]+)", 3)
_ArrayDisplay($a)
On peut vouloir rajouter 'N° CAS' ou 'N. CAS' ou toute autre variante.
Attendez, votre $s c'est une variable classique ?
Que signifie tous ces symbole: "(?:No.-CAS|Numéro CAS)\h+([\d-]+)" ?
Il y a de la doc pour aider à comprendre ?
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#9

Message par Dragor76 »

mikell a écrit : ven. 06 mai 2022 21:07 Ou en bouclant sur une liste de .txt, qqe chose comme ça

$s = ""
; for ...
$txt = FileRead("machin.txt")
$info = StringRegExpReplace($txt, "(?s).*?(?:No.-CAS|Numéro CAS)\s*([\d-]+).*", "$1")
$s &= $info & @CRLF
; next
;Msgbox(0,"", $s)
Ce tous petit code lit extraits les numéros CAS ?
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2278
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#10

Message par jchd »

Attendez, votre $s c'est une variable classique ?
Qu'appelez-vous une "variable classique" ? Je déclare une variable et lui assigne un texte contenant les lignes qui vous intéressent, à titre d'exemple.
Que signifie tous ces symbole: "(?:No.-CAS|Numéro CAS)\h+([\d-]+)" ?
Il y a de la doc pour aider à comprendre ?
Lisez la documentation de StringRegExp !
Ce tous petit code lit extraits les numéros CAS ?
Vous avez au moins essayé le code que je vous ai fourni ?
Si oui, quel a été le résultat ?
Si non, pourquoi ne pas l'essayer ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#11

Message par Dragor76 »

Bonjour,
excusez moi je ne connaissais pas le regex et j'ai mis du temps avant de réussir à lire votre code.

Mes tentatives de généralisation n'ont rien donné.

Le code jchd:

Code : Tout sélectionner

#include <file.au3>
#include <Array.au3>

Global $cheminFichier = @DesktopDir
$arrayFichier =_FileListToArrayRec($cheminFichier,"*.txt", 1, 1, 0, 2) ;retourne un tableau la ligne 0 contient le NB de fichiers
_ArrayDisplay($arrayFichier);affiche l'array pour voir (à supprimer)

Local $Nligne = 1

For $i = 1 To $arrayFichier[0] ; de 1 au nombre de fichiers trouvé
	
	While 1
		$line = FileReadLine($arrayFichier[$i],$Nligne);lecture de la ligne
		If @error = -1 Then ExitLoop
		$Nligne += 1;on incrémente les lignes
		
	WEnd
	
; extraction
Local $a = StringRegExp($line, "(?:No.-CAS|Numéro CAS)\h+([\d-]+)", 3)				;essayer:$line, $arrayFichier, $arrayFichier[$i], $Nligne,

_ArrayDisplay($a)


Next
Pris tel quel le code fonctionne mais quand j'essais de le généraliser le code n'extrait plus rien.

Pour le code mikell:

Code : Tout sélectionner

#include <file.au3>
#include <Array.au3>

Global $cheminFichier = @DesktopDir
$arrayFichier =_FileListToArrayRec($cheminFichier,"*.txt", 1, 1, 0, 2) ;retourne un tableau la ligne 0 contient le NB de fichiers

Local $s = ""

For $i = 1 To $arrayFichier[0] ; de 1 au nombre de fichiers trouvé
	
$txt = FileRead ($arrayFichier)				;essayer: FileReadLine, FileReadtoarray, $arrayFichier, @DesktopDir 
ConsoleWrite($txt & @CRLF)

$info = StringRegExpReplace($txt, "(?s).*?(?:No.-CAS|Numéro CAS)\s*([\d-]+).*", "$1")
$s &= $info & @CRLF

Next

Msgbox(0,"CAS", $s)
Pour un fichier je n'ai pas réussi à le faire fonctionner
J'ai quand même essayé de le généraliser et j'obtiens une msgbox très très longue rempli de blanc (ou de zéro selon ce que je mets)
Pouvez vous m'aider ?

Merci
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#12

Message par mikell »

Certainement mais ce serait fort judicieux de nous fournir des exemples de fichiers .txt (et pas des pdf)
Sans pouvoir tester les scripts "en conditions réelles" on est un tantinet mal barrés
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#13

Message par Dragor76 »

16 04 04 FDS BONDERITE C-AK E-70.txt
(22.8 Kio) Téléchargé 898 fois
21 03 09 FDS BONDERITE C-AK C-43.txt
(31.64 Kio) Téléchargé 889 fois
Acide Chromique.txt
(1.51 Kio) Téléchargé 947 fois
Alumon EN.txt
(45.9 Kio) Téléchargé 897 fois
Amoniaque.txt
(103.2 Kio) Téléchargé 925 fois
Ankor 1120 maintenance salts.txt
(26.57 Kio) Téléchargé 929 fois
Ankor 1120.txt
(26.63 Kio) Téléchargé 930 fois
Ankor Nerostar A.txt
(18 Octets) Téléchargé 927 fois
ANKOR NEROSTAR B.txt
(37.4 Kio) Téléchargé 916 fois
C-43 NF appelée aussi P3-Galvaclean C43.txt
(28.89 Kio) Téléchargé 911 fois
ok, j'en joints 10
Si vous avez besoins de plus d'info sur les numéros CAS:
- Les numéros CAS ont toujours la structure: entre 2 et 6 chiffres-2 chiffres-1 chiffre
- Il y en a parfois plusieurs par fiches (tjr au moins 1)
- Ils sont tjr précédés par "CAS" (n CAS:, CAS:, n° CAS, n. CAS, etc...) en majuscule et sont tjr au début du document, (3 première pages des pdf)
- Il est souvent écrit dans les textes "EN CAS DE …" vers la fin/milieu des documents

Voila
Merci de votre temps
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1028
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#14

Message par walkson »

Vous avez vérifier le contenu des fichiers ?
Ankor Nerostar A.txt et Acide Chromique.txt sont pour le moins bizarres !
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#15

Message par Dragor76 »

dsl j'en ai pris au hasard 10 sur 500 fichiers, il y en a des pourris ducoup en voila 2 autres en échange
EKASIT_BTU_10_(FR).txt
(23.25 Kio) Téléchargé 920 fois
Bronzex Z50 GL Zn.txt
(44.35 Kio) Téléchargé 917 fois
désolé
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#16

Message par Dragor76 »

J'ai compris et trouver le regex qu'il faut pour mon problème
"[0-9]{2,6}-[0-9]{2}-[0-9] "

( un ami m'a passé ce site: https://regex101.com/ )
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#17

Message par mikell »

Ah bin voilà, là c'est quand même plus facile :mrgreen:

#include <file.au3>
#include <Array.au3>

$a =_FileListToArrayRec(@DesktopDir,"*.txt", 1, 1, 0, 1)
$s = ""

For $i = 1 to $a[0]
   $info = StringRegExp(FileRead($a[$i]), 'CAS:?\h+(\d+-\d+-\d)', 3)
   If not IsArray($info) Then ContinueLoop
   For $k = 0 to UBound($info)-1
      $s &= $a[$i] & " ===> " & $info[$k] & @CRLF
   Next
Next

Msgbox(0,"", $s)

Edit
Ou alors en version array et en éliminant les doublons

#include <file.au3>
#include <Array.au3>

$a =_FileListToArrayRec(@DesktopDir,"*.txt", 1, 1, 0, 1)
Local $res[1000], $n = 0

For $i = 1 to $a[0]
   $txt = FileRead($a[$i])
   $info = StringRegExp($txt, 'CAS:?\h+(\d+-\d+-\d)', 3)
   For $k = 0 to UBound($info)-1
      $res[$n] = $a[$i] & " ---- " & $info[$k]
      $n += 1
   Next
Next
ReDim $res[$n]
$res = _ArrayUnique($res)

_ArrayDisplay($res)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#18

Message par Dragor76 »

Le dernier code est très bien, il donne ce que je veux.
Dernier question et c'est bon, comment récupérer le tableau ainsi obtenu (genre avec consolewrite ou filewrite), j'ai essayé plein d'écriture différente sans que rien n'apparaisse

Merci pour tous
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#19

Message par mikell »

Utilise _ArrayToString + FileWrite
Peut-être aussi rajouter au script une petite gestion d'erreur pour les fichiers "pourris", genre

;...
$info = StringRegExp($txt, 'CAS:?\h+(\d+-\d+-\d)', 3)
If @error Then continueLoop
;...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Dragor76
Niveau 2
Niveau 2
Messages : 15
Enregistré le : jeu. 14 avr. 2022 16:48
Status : Hors ligne

Re: extraire info d'un ensemble de fichier

#20

Message par Dragor76 »

Ce qui est bien avec ce code c'est que je me rends compte que je n'y serai jamais arrivé tout seul.
(Bon au moins j'ai appris des trucs)

Merci pour votre aide à tous, ce code va bcp m'aider
Répondre