Page 1 sur 2

extraire info d'un ensemble de fichier

Posté : jeu. 05 mai 2022 15:47
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 ?

Re: extraire info d'un ensemble de fichier

Posté : jeu. 05 mai 2022 17:24
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

Re: extraire info d'un ensemble de fichier

Posté : jeu. 05 mai 2022 21:04
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:

Re: extraire info d'un ensemble de fichier

Posté : ven. 06 mai 2022 10:44
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)

Re: extraire info d'un ensemble de fichier

Posté : ven. 06 mai 2022 16:58
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

Re: extraire info d'un ensemble de fichier

Posté : ven. 06 mai 2022 18:39
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.

Re: extraire info d'un ensemble de fichier

Posté : ven. 06 mai 2022 21:07
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)

Re: extraire info d'un ensemble de fichier

Posté : sam. 07 mai 2022 10:39
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 ?

Re: extraire info d'un ensemble de fichier

Posté : sam. 07 mai 2022 10:42
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 ?

Re: extraire info d'un ensemble de fichier

Posté : sam. 07 mai 2022 11:56
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 ?

Re: extraire info d'un ensemble de fichier

Posté : dim. 08 mai 2022 19:17
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

Re: extraire info d'un ensemble de fichier

Posté : dim. 08 mai 2022 19:40
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

Re: extraire info d'un ensemble de fichier

Posté : dim. 08 mai 2022 20:05
par Dragor76
16 04 04 FDS BONDERITE C-AK E-70.txt
(22.8 Kio) Téléchargé 719 fois
21 03 09 FDS BONDERITE C-AK C-43.txt
(31.64 Kio) Téléchargé 720 fois
Acide Chromique.txt
(1.51 Kio) Téléchargé 730 fois
Alumon EN.txt
(45.9 Kio) Téléchargé 718 fois
Amoniaque.txt
(103.2 Kio) Téléchargé 716 fois
Ankor 1120 maintenance salts.txt
(26.57 Kio) Téléchargé 722 fois
Ankor 1120.txt
(26.63 Kio) Téléchargé 727 fois
Ankor Nerostar A.txt
(18 Octets) Téléchargé 715 fois
ANKOR NEROSTAR B.txt
(37.4 Kio) Téléchargé 723 fois
C-43 NF appelée aussi P3-Galvaclean C43.txt
(28.89 Kio) Téléchargé 722 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

Re: extraire info d'un ensemble de fichier

Posté : dim. 08 mai 2022 21:12
par walkson
Vous avez vérifier le contenu des fichiers ?
Ankor Nerostar A.txt et Acide Chromique.txt sont pour le moins bizarres !

Re: extraire info d'un ensemble de fichier

Posté : dim. 08 mai 2022 21:40
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é 723 fois
Bronzex Z50 GL Zn.txt
(44.35 Kio) Téléchargé 716 fois
désolé

Re: extraire info d'un ensemble de fichier

Posté : dim. 08 mai 2022 22:02
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/ )

Re: extraire info d'un ensemble de fichier

Posté : dim. 08 mai 2022 22:33
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)

Re: extraire info d'un ensemble de fichier

Posté : lun. 09 mai 2022 22:06
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

Re: extraire info d'un ensemble de fichier

Posté : mar. 10 mai 2022 08:11
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
;...

Re: extraire info d'un ensemble de fichier

Posté : mar. 10 mai 2022 11:35
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