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 :

ImageImage

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 :wink:

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 :

Code : Tout sélectionner

$search = FileFindFirstFile($rep_du_site & "\*.txt")
 

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 :

Code : Tout sélectionner

    Fileopen($file,0)
    MsgBox(4096, "File:", $file)
par le code de ce message http://www.autoitscript.fr/forum/viewto ... 9508#p9508
Évidement dans ce dernier, il vous faut remplacer

Code : Tout sélectionner

        MsgBox(0, "Ma valeur absolue est :", $Val)
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 :

Code : Tout sélectionner

MsgBox(0, "Ma valeur absolue est :", $Val)
Pour n'avoir que 2 décimales après la virgule, remplacez la ligne

Code : Tout sélectionner

$Val = ABS(StringMid ($Line, 16))
par

Code : Tout sélectionner

$Val = StringFormat("%.2f", ABS(StringMid ($Line, 16)))
 

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 :P

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 :

Code : Tout sélectionner

If ($file) = "DCS R4P S1A1D"
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

Code : Tout sélectionner

If ($file) = "DCS R4P S1A1D"
par

Code : Tout sélectionner

If ($search[$i]) = "DCS R4P S1A1D"
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

Code : Tout sélectionner

If ($search[$i]) = "DCS R4P S1A1D" Then ...
ne peut jamais être vérifiée car DCS R4P S1A1D n'est pas le nom d'un fichier texte !!!

Le bon code est :

Code : Tout sélectionner

If ($search[$i]) = "DCSR4PS1A1D.txt" Then ...
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.

Code : Tout sélectionner

For $i=1 to $search[0]
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' :

Code : Tout sélectionner

For $i=1 to 5
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 :D
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 :

Code : Tout sélectionner

If ($search[$i]) = "DCSR4PS1A1D.txt" Then ...
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
mais, comme d'habitude, çà ne fonctionne pas :oops:

une erreur de syntaxe peut être ? :?