[R] Ordre de lecture

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
palpyroth
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 25 avr. 2008 09:26
Status : Hors ligne

[R] Ordre de lecture

#1

Message par palpyroth »

J'ai regarde un peut le forum mais n'ayant pas trouve de reponse a ma question je me permet de poster ici.

Je voudrais creer un script qui automatiserait une partie de mon travail mais pour se faire je dois recuperer des donnees dans un fichier texte mais je ne sais pas comment les lire et m'arreter a un carractetre precis.

Mon fichier de donnee ressemble a ca
XXX99999;XXXXXXXX XXXXXXXXX;9999;XXXX_XXXXXXXXXXX
XXX99999;XXXXXXXX XXXXXXXXX;9999;XXXX_XXXXXXXXXXX
XXX99999;XXXXXXXX XXXXXXXXX;9999;XXXX_XXXXXXXXXXX
...
Les X etant des alphabetiques les 9 des numeriques
Le nombre de carractere varie d'une ligne a l'autre c'est pourquoi je devrais placer chaque partie de ma ligne de donnee dans une variable.
chaque donnee etant separee des autres par un ";" je voudrais lire jusqu'au ; et stoquer dans une variable A puis lire jusqu'au ; suivant stoquer dans une variable B ainsi de suite j'usqau carryage return.

Voila en esperant avoir ete clair dans la description de mon probleme (et de ne pas etre passe au dessus de la reponse sur le forum comme souvent :oops: )
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Ordre de lecture

#2

Message par Yogui »

j'ai bien une piste qui me semble être pas si mal :

il existe une fonction

Code : Tout sélectionner

FileRead
pour la tester

tu peux faire :

Code : Tout sélectionner

msgbox(0,"titre",FileRead("c:\exemple.txt"))



j'utiliserai la fonction de tolf recherche dans un string

http://autoitscript.fr/forum/viewtopic.php?f=21&t=642
palpyroth
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 25 avr. 2008 09:26
Status : Hors ligne

Re: [..] Ordre de lecture

#3

Message par palpyroth »

'jai essaye mais je ne suis pas parvenu a faire ce que je voulais faire avec cette commande mais je ne perds pas espoir :)
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Ordre de lecture

#4

Message par Yogui »

j'espère que ça va pouvoir t'aider

Code : Tout sélectionner


$i =1

    $hTest = FileRead ("c:\exemple.txt")
    $aTest = StringSplit($hTest, "")

    $i=$i+1
    
    While $aTest[$i] <> ";" 
            $aTest = StringSplit($hTest, "")
            $i=$i+1
        
WEnd
$hTest = FileRead("c:\exemple.txt",$i)
MsgBox(0,"premier groupe",$hTest)
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Ordre de lecture

#5

Message par Yogui »

re moi j'ai modifié mon code encore une fois celui la est plus rapide

il faudrait faire un code qui compte le nombre de caractère par ligne le mettre dans une boucle

du genre :

While $fin <> $nombre_caractères_de_la_ligne faire

plus qu'a passer une ligne

Code : Tout sélectionner

$debut = 1
$fin = 1
$hTest = FileRead ("c:\exemple.txt")
$aTest = StringSplit($hTest, "")

    While $aTest[$fin] <> ";" 
            $aTest = StringSplit($hTest, "")
            $fin=$fin+1
    WEnd

$var = StringMid($hTest, $debut, $fin)

MsgBox(0, "premier groupe", $var)

 
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Ordre de lecture

#6

Message par Tlem »

L'idéal dans votre cas, serait de placer tout ca dans une matrice multidimensionnelle, mais c'est peut être beaucoup de complication pour pas grand chose.

Pour faire plus simple, vous pouvez déjà stocker votre fichier dans une matrice classique par le simple code :

Code : Tout sélectionner

#include <file.au3>  ; Ajout de la librairie file.au3

Dim $aRecords  ; Déclaration de la matrice $aRecords.
If Not _FileReadToArray("fichier.txt",$aRecords) Then  ; Si il n'est pas possible de mettre le fichier
                                                       ; dans la matrice
   MsgBox(4096,"Erreur", "Erreur de lecture du fichier.") ; Alors message d'erreur.
   Exit ; Puis sortie du script.
EndIf
Vous aurez donc après ceci une matrice (Un tableau) ou chaque ligne de votre fichier correspond à une ligne de la matrice.
La ligne 0 de la matrice contient le nombre d'éléments récupérer en l'occurrence du fichier.
Ensuite, les lignes 1, 2, 3 ... correspondrons aux lignes de votre fichier.

Ensuite en fonction du traitement que vous souhaitez effectuer, il vous suffit de prendre chaque ligne de la matrice, et d'en extraire vos information.
Ajoutez ce code au code précédent :

Code : Tout sélectionner

Dim $aDatas ; Déclaration de la matrice $aDatas
For $i = 1 to $aRecords[0] ; Boucle pour lister chaque élément de la matrice $aRecords
    $aDatas = StringSplit($aRecords[$i], ";") ; "Découpage" de la ligne en éléments.
    
    ; Cette partie n'est là que pour afficher les éléments "découpés".
    Dim $Res = "" ; La variable $Res est initialisée à vide.
    For $j = 1 To $aDatas[0]  ; Petite boucle sur le nombre d'élément de $aDatas
        $Res = $Res & "Variable " & $J & " = " & $aDatas[$j] & @CRLF ; Bon, là c'est pour l'affichage.
    Next ; Fin de boucle.
    MsgBox(64,"Résultat", " Voici la liste des éléments de la ligne " & $i & @CRLF & $Res)
    ; Fin de la partie affichage.
Next
Lors du "découpage" de votre ligne avec StringSplit, vous créer une matrice comme précédemment avec la ligne 0 de la matrice qui contient le nombre d'éléments, puis chaque éléments récupéré par ligne.

Voilà, j'espère avoir donné suffisamment d'explications dans le code pour que vous l'adaptiez à vos besoins.
Si par cas, vous souhaitez "découper" l'intégralité du fichier dans une matrice multidimensionnelle, nous essayerons de développer le sujet, mais son utilisation risque d'être complexe par rapport à votre besoin ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Yogui
Niveau 9
Niveau 9
Messages : 689
Enregistré le : ven. 18 avr. 2008 17:29
Status : Hors ligne

Re: [..] Ordre de lecture

#7

Message par Yogui »

j'ai tenté mon bout de code sur un très gros fichier (j'ai planté mon pc)

j'ai cherché dans les docs un moyen moins gourmand en ressource et j'ai trouvé la fonction StringSplit plus qu'a trouver un moyen de passer une ligne ...

Code : Tout sélectionner

$groupe = 1 ;0 étant le nombre de groupe 2 étant le permier groupe ...

$fichier=FileRead ("c:\exemple.txt")
$tab = StringSplit($fichier, ";")
MsgBox(0,"",$tab[$groupe])
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Ordre de lecture

#8

Message par sylvanie »

Bonsoir,

quand on travaille avec du gros fichier, il ne faut pas buffuriser tout le contenu d'un coups (surtout si on parle de centaine de Mo ...). il faut le traiter ligne par ligne, c'est plus long, mais les quantité de ram utilisée restent de l'ordre d'une ligne ...

Code : Tout sélectionner

$groupe = 1 ;0 étant le nombre de groupe 2 étant le permier groupe ...
$handle_fichier=FileOpen("c:\exemple.txt",0) ; ouverture du fichier en lecture seule
If $handle_fichier = -1 Then Exit 1 ; pb d'ouverture
While 1
    $ligne=FileReadLine($handle_fichier)
    if @error = -1 Then ExitLoop ; fin du fichier : on sort du while
    $tab = StringSplit($ligne, ";")
    MsgBox(0,"",$tab[$groupe])
WEnd
fileclose($handle_fichier)
 
ps : par contre j'ai juste repris l'exple précédent qui n'affiche que le 1 er element. Est ce bien le but ?
Re ps :
Comme ça faisait longtemps que j'avais pas posté, un petit coups d'expression régulière :

Code : Tout sélectionner

#include <Array.au3>

$groupe = 1 ;0 étant le nombre de groupe 2 étant le permier groupe ...
$handle_fichier=FileOpen("c:\exemple.txt",0) ; ouverture du fichier en lecture seule
If $handle_fichier = -1 Then Exit 1 ; pb d'ouverture
While 1
    $ligne=FileReadLine($handle_fichier)
    if @error = -1 Then ExitLoop ; fin du fichier : on sort du while
    ;$tab = StringSplit($ligne, ";")
    $tab=StringRegExp($ligne,"(.*);(.*);(.*);(.*)",3)
    if IsArray($tab) Then _ArrayDisplay($tab)
WEnd

 
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Ordre de lecture

#9

Message par Tlem »

Effectivement, je n'ai pas traiter cette partie.
Je rejoins tout à fait Sylvanie sur ce point, si le fichier fait plusieurs dizaines de Mo, alors il vaut mieux le traiter ligne par ligne.

Cela dit, palpyroth ne fait aucune référence à un fichier volumineux, d'où mon orientation. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
palpyroth
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 25 avr. 2008 09:26
Status : Hors ligne

Re: [..] Ordre de lecture

#10

Message par palpyroth »

Dans mon cas il ne s'agit pas d'un fichier volumineux une centaine d'entree par jours ^^
Merci a tous pour vos reponses je vous tiendrai au courrant car la je suis dans l'incapaciter d'essayer cela
palpyroth
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 25 avr. 2008 09:26
Status : Hors ligne

Re: [..] Ordre de lecture

#11

Message par palpyroth »

Effectivement le code
#include <file.au3> ; Ajout de la librairie file.au3

Dim $aRecords ; Déclaration de la matrice $aRecords.
If Not _FileReadToArray("c:\exemple.txt",$aRecords) Then ; Si il n'est pas possible de mettre le fichier
; dans la matrice
MsgBox(4096,"Erreur", "Erreur de lecture du fichier.") ; Alors message d'erreur.
Exit ; Puis sortie du script.
EndIf
Dim $aDatas ; Déclaration de la matrice $aDatas
For $i = 1 to $aRecords[0] ; Boucle pour lister chaque élément de la matrice $aRecords
$aDatas = StringSplit($aRecords[$i], ";") ; "Découpage" de la ligne en éléments.

; Cette partie n'est là que pour afficher les éléments "découpés".
Dim $Res = "" ; La variable $Res est initialisée à vide.
For $j = 1 To $aDatas[0] ; Petite boucle sur le nombre d'élément de $aDatas
$Res = $Res & "Variable " & $J & " = " & $aDatas[$j] & @CRLF ; Bon, là c'est pour l'affichage.
Next ; Fin de boucle.
MsgBox(64,"Résultat", " Voici la liste des éléments de la ligne " & $i & @CRLF & $Res)
; Fin de la partie affichage.
Next
fonctionne mais je voudrais placer chaque donnee dans une variable (A,B,C,...)
XXX99999;XXXXXXXX XXXXXXXXX;9999;XXXX_XXXXXXXXXXX

A[1]=XXX99999
B[1]=XXXXXXXX XXXXXXXXX
C[1]=9999
D[1]=XXXX_XXXXXXXXXXX
pour pouvoir les amener dans d'autres programmes
comment appeller chaque variable une a une?
A mon avis il faudrait mettre les donnees dans un tableau mais je ne sais pas comment faire

Merci de votre aide
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Ordre de lecture

#12

Message par Tlem »

Vos données sont déjà dans un tableau (Matrice).
Elle sont mises par ligne et non par élément.

Mais la ligne :

Code : Tout sélectionner

$aDatas = StringSplit($aRecords[$i], ";") ; "Découpage" de la ligne en éléments.
vous permet de ressortir chaque éléments de la ligne.
Vous aurez :

Code : Tout sélectionner

$aDatas[0] ; Nombre d'éléments dans la nouvelle matrice de ligne.
$aDatas[1] ; 1er élément
$aDatas[2] ; 2iem élément
$aDatas[3] ; 3iem élément
$aDatas[4] ; 4iem élément
...
Plutôt que de tout mettre en variable (Ce qui risque de demander beaucoup de ressource), utilisez la ligne de découpage de vos lignes en fonction de vos besoins.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
palpyroth
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 25 avr. 2008 09:26
Status : Hors ligne

Re: [..] Ordre de lecture

#13

Message par palpyroth »

Je dois admettre que je ne comprends pas que le code

Code : Tout sélectionner

#include <file.au3>  ; Ajout de la librairie file.au3

Dim $aRecords  ; Déclaration de la matrice $aRecords.
Dim $aDatas ; Déclaration de la matrice $aDatas


If Not _FileReadToArray("c:\exemple.txt",$aRecords) Then  ; Si il n'est pas possible de mettre le fichier
                                                       ; dans la matrice
   MsgBox(4096,"Erreur", "Erreur de lecture du fichier.") ; Alors message d'erreur.
   Exit ; Puis sortie du script.
EndIf

For $i = 1 to $aRecords[0] ; Boucle pour lister chaque élément de la matrice $aRecords
    $aDatas = StringSplit($aRecords[$i], ";") ; "Découpage" de la ligne en éléments.
    
    ; Cette partie n'est là que pour afficher les éléments "découpés".
;    Dim $Res = "" ; La variable $Res est initialisée à vide.
;    For $j = 1 To $aDatas[0]  ; Petite boucle sur le nombre d'élément de $aDatas
;        $Res = $Res & "Variable " & $J & " = " & $aDatas[$j] & @CRLF ; Bon, là c'est pour l'affichage.
;   Next ; Fin de boucle.
;    MsgBox(64,"Résultat", " Voici la liste des éléments de la ligne " & $i & @CRLF & $aDatas[$i] )
    ; Fin de la partie affichage.
Next
MsgBox(0, "Test", $aDatas[1])
me donne comme resultat
XXX99999;XXXXXXXX XXXXXXXXX;9999;XXXX_XXXXXXXXXXX
et non
XXX99999
Comme explique plus haut :oops: (je suis sur que c'est encore une betise mais bon... :roll:
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Ordre de lecture

#14

Message par Tlem »

Essayez ceci :

Code : Tout sélectionner

#include <file.au3>  ; Ajout de la librairie file.au3

Dim $aRecords, $aDatas

If Not _FileReadToArray("c:\exemple.txt",$aRecords) Then
   MsgBox(4096,"Erreur", "Erreur de lecture du fichier.")
   Exit
EndIf

For $i = 1 to $aRecords[0]
    $aDatas = StringSplit($aRecords[$i], ";")
    MsgBox(0, "Test", "Ligne " & $i & " : " & @CRLF & _
        "$aDatas[1] = " & $aDatas[1] & @CRLF & _
        "$aDatas[2] = " & $aDatas[2] & @CRLF &  _
        "$aDatas[3] = " & $aDatas[3] & @CRLF & _
        "$aDatas[4] = " & $aDatas[4] )
Next
 
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre