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

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

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
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
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
Edit
Ou alors en version array et en éliminant les doublons
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
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