Conversion de fichier texte

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Conversion de fichier texte

Message par Marc56 »

ballow a écrit :On dirait que pour lui, " i " est toujours égal à 0.
Comme l'a indiqué Ar-S, tu as dû oublier de l'incrémenter dans une boucle
Mon code est constitué comme ceci:

Code : Tout sélectionner

   
While Not Eof(#handle_Fichier_IN)
        Read_Line = ReadString(#handle_Fichier_IN)
        ... (analyse de la ligne)
        i + 1
        ...
Wend
PB permet une syntaxe proche du C:
i + 1 <=> i = i + i <=> i++
Not = Autre chose que la valeur initiale de la variable

Classiquement on écrit souvent comme ceci:

Code : Tout sélectionner

While EOF(#handle_Fichier_IN) <> 0
        Read_Line = ReadString(#handle_Fichier_IN)
        ... (analyse de la ligne)
        i = i + 1
        ...
Wend
(Mais habitude de Perl oblige, j'aime bien en écrire le moins possible :mrgreen: )

Bref, ici 'i' sert de compteur de ligne, mais comme il est incrémenté après le traitement, la première fois il est donc égal à 0

:)
ballow
Messages : 7
Inscription : jeu. 28/janv./2016 1:36

Re: Conversion de fichier texte

Message par ballow »

@Ar-S, @Marc56, en effet je m'étais embrouillé...

Maintenant ça fonctionne ma première ligne est bien différente des autres :D

Le problème que j'ai maintenant c'est que mon fichier de sortie se répète à l'infinie !
Mon fichier d'entrée ne contient que 250 lignes, mon fichier de sortie, lui en contient à l'infini...

C'est surement dû à ma boucle for :

Code : Tout sélectionner

For i = 0 To 250 Step 1
Il faut que je lui dise qu'à la fin du fichiers (quand il n'y a plus de lignes), il doit s'arreter. Je ne doit pas être obligé de mettre ce "250".

Je vais remettre tout ça au propre et je verrais bien mon erreur. Je vous tiens au courant ! Merci encore ! :)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Conversion de fichier texte

Message par Marc56 »

ballow a écrit :Le problème que j'ai maintenant c'est que mon fichier de sortie se répète à l'infini !
Mon fichier d'entrée ne contient que 250 lignes, mon fichier de sortie, lui en contient à l'infini...
D'où l'intérêt de ne pas utiliser une boucle For / Next, mais de boucler jusqu'à trouver le caractère de fin de fichier (EOF)

Code : Tout sélectionner

Open(#fichier)
    While Not Eof(#fichier)
        ... 
    Wend
Close(#fichier)
Si tu tiens à utiliser une boucle For / Next alors tu peux en sortir dès que la ligne lue est vide en utilisant l'instruction Break

:wink:
ballow
Messages : 7
Inscription : jeu. 28/janv./2016 1:36

Re: Conversion de fichier texte

Message par ballow »

Bonjour bonjour,

Alors, j'ai revu mon code, effectivement, je devais être fatigué, car quelques erreurs s'y étaient glissées...

pour résumé mon intention de départ :
Je voulais remettre en forme un fichier texte puis le découper toute les 200 lignes. Tout cela automatiquement grâce à un watchfolder...

Voici ma partie traitement (sans la procédure "watchfolder") :

Code : Tout sélectionner

Procedure Traitement()
  

  
PtTableau.l ; Pointeur tableau : tableau du watchfolder dans lequel il y a les noms de fichiers
flag1line.b ; Sert à definir la première ligne du fichier
compteurlignes.w ; Compteur de ligne
compteurfichier.b ; Compteur de fichiers de sortie

;*
;* On regarde si il y a des fichiers dans le watchfolder.
;*-------------------------------------------------------

Repeat
  FlagExamRep=1
  If WatchFolder2Tab(GetGadgetText(#String_4), ".plt") ; Pas de fichier dans le rep. source.
    ;*
    ;* Si oui ReperIn$ ---> ReperOut$.
    ;*--------------------------------
    For PtTableau=0 To NbFichWatch-1
      Chy$=TabRepSrc$(1, PtTableau)
      compteurfichier = 1
      
      If FileSize(GetGadgetText(#String_4)+Chy$) <>-1 ; si le fichier n'existe pas alors --->
        OpenFile(#FichierPLT, GetGadgetText(#String_4)+Chy$) ; Ouvre le fichier plt qu'il y a dans le dossier inbox
        CreateFile(#FichierPlayT, GetGadgetText(#String_5)+Chy$+"_PlayT_"+Str(compteurfichier)+".txt")
        flag1line = #False       
        compteurlignes = 0 ; On initialise le compteur de lignes
        Repeat
          If compteurlignes = 200
            CloseFile(#FichierPlayT)
            Delay(100)
            compteurfichier+1
           ;flag1line = #False    Si besoin d'avoir dans chaque fichiers de sortie la première ligne en hard
            CreateFile(#FichierPlayT, GetGadgetText(#String_5)+Chy$+"_PlayT_"+Str(compteurfichier)+".txt")
            compteurlignes=0
          EndIf
          If Eof(#FichierPLT)
            CloseFile(#FichierPLT)
            CloseFile(#FichierPlayT)
            Break
          EndIf
          
          Texte$ = ReadString(#FichierPLT)
          ID$ = StringField(Texte$, 1, Chr(9)) ; On isole l'ID
          Playtime$ = StringField(Texte$, 5, Chr(9)) ; On isole l'heure de play
                    
          If flag1line = #False
            Duration$ = ""
            type$ = "hard" ; Le permier pas de la playlist est en hard start, seulement le premier pas !
            flag1line = #True
          Else 
            Duration$ = StringField(Texte$, 7, Chr(9)) ; On isole la durée du media on ne le met pas sur la première ligne !
            type$ = "auto"
          EndIf

          title$ = StringField(Texte$, 8, Chr(9)) ; On isole le titre du media
          som$ = StringField(Texte$, 6, Chr(9)) ; On isole le SOM (Start Of Media)
            
          ; Ci-dessous on fabrique le fichier de sortie en lui precisant ce qu'on souhaite avoir...
          WriteStringN(#FichierPlayT, GetGadgetText(#String_3) + ID$ + Chr(9) + Playtime$ + Chr(9) + Playtime$ + Chr(9) + Duration$ + Chr(9) + Chr(9) + Chr(9) + type$ + Chr(9) + title$+Chr(9)+ "0" + Chr(9) + som$)
          
          compteurlignes+1 ; on incremente le compteur de ligne de 1

        ForEver
      EndIf
      
      EventID=WindowEvent()
      If EventID=#PB_Event_Gadget
        Select EventGadget()
          Case #Button_3 ;Quitter
            Break
        EndSelect
      EndIf 
           
    If Not RenameFile(GetGadgetText(#String_4)+Chy$, GetGadgetText(#String_4)+"OK\"+Chy$) ; Une fois le PLT traité, on le déplace dans le dossier OK
      DeleteFile(GetGadgetText(#String_4)+"OK\"+Chy$) ; Si le fichier existe déjà dans le dossier "OK", il sera supprimé.
    EndIf 

    Next

  EndIf
  EventID=WindowEvent()
  If EventID=#PB_Event_Gadget
    Select EventGadget()
      Case #Button_3 ;Quitter
        Break
    EndSelect
  EndIf
  Delay(20)
ForEver



ProcedureReturn #True  
  
EndProcedure
Il y a surement de l'optimisation à faire mais en tout cas ça fonctionne déjà très bien :)
Merci à tous pour votre aide ! si il y a des intéressés, je peux fournir les fichiers ;-)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Conversion de fichier texte

Message par Marc56 »

Si ça marche, tant mieux :P mais ta façon de procéder est bizarre :?:

Par exemple, tu testes plusieurs fois dans une procédure avec WindowEvent() si un bouton est cliqué.

Code : Tout sélectionner

      EventID=WindowEvent()
      If EventID=#PB_Event_Gadget
        Select EventGadget()
          Case #Button_3 ;Quitter
            Break
        EndSelect
      EndIf
C'est inutile, il suffit de mettre ceci dans la boucle principale. (ou dans un BindGadgetEvent())
De plus il y a des inconvénients à WindowsEvent(). Regarde les remarques en milieu d'aide.

Au début, tu parles de pointeurs, mais tu ne l'utilise pas comme tel

Code : Tout sélectionner

PtTableau.l ; Pointeur tableau : tableau du watchfolder dans lequel il y a les noms de fichiers
...
For PtTableau=0 To NbFichWatch-1
C'est peut-être juste une question de vocabulaire vis à vis d'autres langages, mais les pointeurs sont autre chose
http://www.purebasic.com/french/documen ... emory.html

:wink:
Répondre