Page 1 sur 2
[R] Récupérer une valeur dans des fichiers textes
Posté : mer. 08 oct. 2008 22:31
par dadrocket
Bonsoir,
Je suis encore de retour !
Je souhaiterais récuperer une valeur dans des fichiers texte (cette valeur se situe toujours au meme endroit), en créer une variable pour ensuite la copier dans un tableau excel.
Il y a environ une centaine de fichiers texte situé dans un même répertoire. Je voudrais que le script ouvre les fichiers un par un afin de copier la valeur et surtout qu'il ne traite pas deux fois le même fichier (comptage des fichiers dans le répertoire ?).
Voici une capture d'écran d'un répertoire avec les fichiers texte :

Merci d'avance.
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 08 oct. 2008 22:37
par Tlem
Si vous ne donnez pas plus d'information que ça, je doute que l'on puisse vous aider ...
- Quelle est la chaîne à récupérer.
- Comment est fait le fichier texte.
- Pouvons nous avoir un extrait du fichier.
- Comment voulez vous utiliser cette variable.
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 08 oct. 2008 22:57
par dadrocket
Merci de cette rapide réponse !
La chaine à récupérer est la valeur absolue du marqueur 5 (Ici 17.3933246300998)
Cette valeur sera juste copier dans une certaine case d'un tableau Excel (selon le nom du fichier texte).
J'ai déjà une solution pour l'exportation de la valeur dans Excel. Mon problème se pose plutôt dans le copiage de la valeur du marqueur 5.
Voici une fichier texte pour exemple :
http://dl.free.fr/lk0bpaGNN
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 08 oct. 2008 23:11
par Tlem
Voici la solution :
Code : Tout sélectionner
$File = FileOpen("DCSR4PS1A1D.txt", 0)
While 1
$Line = FileReadLine($File)
If @error = -1 Then ExitLoop
If StringLeft($Line, 15) = "Marker 5 Value:" Then
$Val = ABS(StringMid ($Line, 16))
MsgBox(0, "Ma valeur absolue est :", $Val)
EndIf
Wend
FileClose($file)
A vous de faire la boucle de recherche des fichiers (Il y a suffisamment d'exemples sur le forum).
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : dim. 12 oct. 2008 15:46
par dadrocket
Merci pour ce script, ça fonctionne
Pourrais-tu m'éclairer concernant la recherche de fichiers ?
En fait je souhaiterais :
1)ouvrir un fichier texte
2)copier la valeur du marqueur 5 (OK grâce à ton script Tlem)
3)la coller dans une variable (OK pour moi)
4)fermer ce fichier texte
5)passer au fichier texte suivant
6)envoyer toutes les variables dans un tableau Excel (OK pour moi)
Mon problème se situe donc dans l'ouverture/fermeture des fichiers texte (ne pas traiter 2 fois le même fichier). Je souhaiterais une méthode fiable car si une valeur absolue est copiée 2 fois, c'est la catastrophe !
Merci d'avance.
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : dim. 12 oct. 2008 21:53
par Tlem
Puisque vos fichiers sont dans le même répertoire, vous pouvez tout simplement utiliser l'exemple fournit dans l'aide de la commande
FileFindFirstFile.
Évidemment vous devrez modifier le chemin et le masque de recherche.
Il vous suffira alors d'imbriquer la boucle d'extraction (que vous pouvez aussi mettre sous forme de fonction) dans la boucle de recherche de fichiers. CQFD
Sinon, vous pouvez aussi utiliser cet UDF :
http://www.autoitscript.fr/forum/viewto ... f=21&t=479
Il vous retournera un tableau de tout les fichiers trouvés.
Ensuite une simple boucle de lecture du tableau et traitement au fur et à mesure.
Ce choix alourdira votre code de l'UDF, mais rendra plus souple la recherche de fichiers.
Perso, je vous conseil de stocker l'UDF dans le même répertoire que votre script, puis de rajouter
#include<_FileListToArrayNew2h.au3> (Voir l'exemple du post).
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : lun. 13 oct. 2008 22:44
par dadrocket
Merci,
Je viens d'essayer quelque chose mais ca ne fonctionne pas comme je veux :
Code : Tout sélectionner
$rep_du_site = FileSelectFolder("Selectionnez le répertoire du site.", "")
$search = FileFindFirstFile($rep_du_site)
; Check if the search was successful
If $search = -1 Then
MsgBox(0, "Error", "No files/directories matched the search pattern")
Exit
EndIf
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
MsgBox(4096, "File:", $file)
WEnd
; Close the search handle
FileClose($search)
Le script me retourne le répertoire de la variable $rep_du_site et non pas les fichiers qu'il y a dedans.
Aussi, comment créer un filtre pour les fichiers textes ?
Merci d'avance
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : lun. 13 oct. 2008 23:07
par Tlem
Ben, il faut tout simplement lui dire ce que vous cherchez :
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : lun. 27 oct. 2008 20:00
par dadrocket
Bonsoir,
Effectivement, ça marche !
Maintenant je ne sais pas comment ouvrir les fichiers textes un par un afin de récupérer les valeurs
J'ai bien tenté ceci :
Code : Tout sélectionner
$rep_du_site = FileSelectFolder("Selectionnez le répertoire du site.", "")
$search = FileFindFirstFile($rep_du_site & "\*.txt")
; Check if the search was successful
If $search = -1 Then
MsgBox(0, "Error", "No files/directories matched the search pattern")
Exit
EndIf
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
Fileopen($file,0)
MsgBox(4096, "File:", $file)
WEnd
; Close the search handle
FileClose($search)
Mais sans succès.
Tlem, peux tu m'éclaircir pour ce problème ainsi que pour l'imbrication des boucles ?
PS : Est-il possible de dialoguer par MSN pour plus de facilité ?
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mar. 28 oct. 2008 08:58
par Tlem
Il vous suffit de remplacer les deux lignes :
par le code de ce message
http://www.autoitscript.fr/forum/viewto ... 9508#p9508
Évidement dans ce dernier, il vous faut remplacer
par le code d'export de la valeur dans le fichier Excel.
dadrocket a écrit :PS : Est-il possible de dialoguer par MSN pour plus de facilité ?
En ce moment c'est assez difficile, je ne suis que de passage car j'ai pas mal de taf et donc pas trop disponible.
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mar. 28 oct. 2008 19:58
par dadrocket
Une nouvelle fois merci pour ton aide Tlem !
J'ai bien tenté ceci :
Code : Tout sélectionner
$rep_du_site = FileSelectFolder("Selectionnez le répertoire du site.", "")
$search = FileFindFirstFile($rep_du_site & "\*.txt")
; Check if the search was successful
If $search = -1 Then
MsgBox(0, "Error", "No files/directories matched the search pattern")
Exit
EndIf
While 1
$file1 = FileFindNextFile($search)
If @error Then ExitLoop
$file2 = FileOpen($file1, 0)
While 1
$Line = FileReadLine($file2)
If @error = -1 Then ExitLoop
If StringLeft($Line, 15) = "Marker 5 Value:" Then
$Val = ABS(StringMid ($Line, 16))
MsgBox(0, "Ma valeur absolue est :", $Val)
EndIf
Wend
FileClose($file1)
WEnd
; Close the search handle
FileClose($search)
mais après la sélection du répertoire, il ne se passe rien
PS : comment faire pour ne copier que 2 chiffres après la virgule dans la valeur du marqueur 5 ?

Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mar. 28 oct. 2008 23:28
par Tlem
Normal, le script boucle dans la seconde boucle.

Il vous faut rajouter l'instruction ExitLoop après la ligne :
Pour n'avoir que 2 décimales après la virgule, remplacez la ligne
par
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 29 oct. 2008 08:22
par Tlem
Voici ne autre approche qui consisterait à ne pas utiliser la fonction
FindFirstFile mais son implémentation dans la commande
_FileListToArray (qui me parait plus simple) :
Code : Tout sélectionner
#include <File.au3>
$rep_du_site = FileSelectFolder("Selectionnez le répertoire du site.", "")
$search = _FileListToArray($rep_du_site, "*.txt", 1)
If @error Then
MsgBox(0, "", "Aucun Fichier txt trouvé.")
Exit
EndIf
For $i = 1 To $search[0]
$file = FileOpen($rep_du_site & "\" & $search[$i], 0)
While 1
$Line = FileReadLine($file)
If @error = -1 Then ExitLoop
ConsoleWrite($Line & @CRLF)
If StringLeft($Line, 15) = "Marker 5 Value:" Then
$Val = StringFormat("%.2f", ABS(StringMid ($Line, 16)))
MsgBox(0, "Ma valeur absolue est :", $Val)
ExitLoop
EndIf
WEnd
FileClose($file)
Next
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 29 oct. 2008 22:11
par dadrocket
Merci !
Effectivement, ça fonctionne. Je ne sais pas comment mais ça fonctionne
Une tentative :
Code : Tout sélectionner
#include <File.au3>
$rep_du_site = FileSelectFolder("Selectionnez le répertoire du site.", "")
$search = _FileListToArray($rep_du_site, "*.txt", 1)
If @error Then
MsgBox(0, "", "Aucun Fichier txt trouvé.")
Exit
EndIf
For $i = 1 To $search[0]
$file = FileOpen($rep_du_site & "\" & $search[$i], 0)
While 1
$Line = FileReadLine($file)
If @error = -1 Then ExitLoop
ConsoleWrite($Line & @CRLF)
If StringLeft($Line, 15) = "Marker 5 Value:" Then
$Val = StringFormat("%.2f", ABS(StringMid ($Line, 16)))
MsgBox(0, "Ma valeur absolue est :", $Val)
If ($file) = "DCS R4P S1A1D" Then
Opt("WinWaitDelay", 100)
Opt("WinTitleMatchMode", 4)
Opt("WinDetectHiddenText", 1)
Opt("MouseCoordMode", 0)
WinWait("Microsoft Excel")
If Not WinActive("Microsoft Excel") Then WinActivate("Microsoft Excel")
WinWaitActive("Microsoft Excel")
Send("^t")
Send("AG2")
Send("{Enter}")
Send($Val)
Send("{Enter}")
EndIf
EndIf
WEnd
FileClose($file)
Next
je n'ai pas d'erreur mais il ne se passe rien dans Excel.
Peux-tu m'éclairer ?
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 29 oct. 2008 22:18
par Tlem
Parce que cette condition ne peut être remplie :
Car
$file est égal au chemin du fichier + le nom du fichier.
Utilisez plutôt la valeur
$search[$i] qui correspondra dans la boucle au nom du fichier seul.
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 29 oct. 2008 23:08
par dadrocket
en remplaçant
par
ca ne fonctionne pas
d'ailleurs je ne comprend pas cette variable : "$search[$i]"
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : mer. 29 oct. 2008 23:43
par Tlem
Exact, j'ai été un peut vite, mais celon ce que j'ai dit vous auriez dut comprendre l'erreur.
La condition
ne peut jamais être vérifiée car
DCS R4P S1A1D n'est pas le nom d'un fichier texte !!!
Le bon code est :
dadrocket a écrit :d'ailleurs je ne comprend pas cette variable : "$search[$i]"
C'est tout simplement une des valeurs du tableau
$search.
En utilisant la fonction
_FileListToArray, on crée un tableau de X éléments qui contient la liste des fichiers texte du répertoire de recherche.
Cela nous donne :
Code : Tout sélectionner
$search[0]=5 ;Le nombre d'éléments du tableau (et par conséquent de fichiers trouvés).
$search[1]="LeFichier1.txt" ; Le nom du premier fichier texte trouvé
$search[2]="LeFichier2.txt" ; Le nom du deuxième fichier texte trouvé
$search[3]="LeFichier3.txt" ; Le nom du treizième fichier texte trouvé
$search[4]="LeFichier4.txt" ; Le nom du quatrième fichier texte trouvé
$search[5]="LeFichier5.txt" ; Le nom du cinquième fichier texte trouvé
Une fois le tableau obtenu, nous créons une boucle qui va lire les éléments un par un.
Cette ligne indique que nous créons une variable qui démarre à 1 et qui sera incrémentée de 1 à chaque retour de boucle jusqu'à la valeur de
$search[0] (soit 5).
Ce qui nous donne en version 'traduite' :
Ensuite dans la boucle on utilise la variable
$search[$i] qui représente en fonction de la valeur de
$i un des éléments du tableau.
Voilà, j'espère que mon explication à été suffisamment claire pour votre compréhension.
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : jeu. 30 oct. 2008 10:58
par dadrocket
Merci bien pour toutes ces informations
Le script fonctionne bien... mais pour un seul fichier texte !
Serait-il possible de récupérer la valeur du marqueur 5 dans tous les fichiers textes et ensuite tout coller dans Excel ?
Cela éviterai les aller retours vers Excel et allègerais le script.
Merci d'avance
Re: [..] Récupérer une valeur dans des fichiers textes
Posté : jeu. 30 oct. 2008 19:16
par Tlem
Oui c'est possible, mais il vous faudra gérer la condition :
C'est elle qui cantonne à un seul fichier (DCSR4PS1A1D.txt).
Après, je ne sais pas comment vous gérez les valeurs par rapport aux champs Excel, mais dans l'idée, se serait de virer cette condition mais de rajouter après le copier/coller le passage à une autre cellule pour faire le copier/coller suivant.
Pour cette partie, je vous laisse gérer tout seul.

Re: [..] Récupérer une valeur dans des fichiers textes
Posté : jeu. 30 oct. 2008 23:10
par dadrocket
Je tente quelque chose :
► Afficher le texte
Code : Tout sélectionner
#include <File.au3>
$rep_du_site = FileSelectFolder("Selectionnez le répertoire du site.", "")
$search = _FileListToArray($rep_du_site, "*.txt", 1)
If @error Then
MsgBox(0, "", "Aucun Fichier txt trouvé.")
Exit
EndIf
For $i = 1 To $search[0]
$file = FileOpen($rep_du_site & "\" & $search[$i], 0)
While 1
$Line = FileReadLine($file)
If @error = -1 Then ExitLoop
ConsoleWrite($Line & @CRLF)
If StringLeft($Line, 15) = "Marker 5 Value:" Then
$Val = StringFormat("%.2f", Abs(StringMid($Line, 16)))
MsgBox(0, "Ma valeur absolue est :", $Val)
If ($search[$i]) = "DCSR4PS1A1D.txt" then $DCSR4PS1A1D = $Val
If ($search[$i]) = "DCSR4PS1A1M.txt" then $DCSR4PS1A1M = $Val
Opt("WinWaitDelay", 100)
Opt("WinTitleMatchMode", 4)
Opt("WinDetectHiddenText", 1)
Opt("MouseCoordMode", 0)
WinWait("Microsoft Excel")
If Not WinActive("Microsoft Excel") Then WinActivate("Microsoft Excel")
WinWaitActive("Microsoft Excel")
;DCSR4PS1A1D
Send("^t")
Send("AG2")
Send("{Enter}")
Send($DCSR4PS1A1D)
Send("{Enter}")
;DCSR4PS1A1M
Send("^t")
Send("AF2")
Send("{Enter}")
Send($DCSR4PS1A1M)
Send("{Enter}")
EndIf
ExitLoop
EndIf
WEnd
FileClose($file)
Next
mais, comme d'habitude, çà ne fonctionne pas
une erreur de syntaxe peut être ?
