[Résolu]Formatage de date d'un ListIconGadget bizarre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
micam
Messages : 46
Inscription : ven. 27/avr./2012 15:29

[Résolu]Formatage de date d'un ListIconGadget bizarre

Message par micam »

Bonjour.
J’ai un problème de transformation de date extraite d’un ListIconGadget alimenté par un fichier texte avec tabulations.
Exemple du fichier à enregistrer au format ".txt" :
  • 01/06/2001 VIREMENT PAR INTERNET 300,00
    12/06/2001 Frais bancaires 72,12
    15/06/2001 * COTISATION BOUQUET LIBERTE 12,12
Date au format fr « dd/mm/yyy » que je voudrais transformer au format « yyyymmdd ».
J’arrive à formater correctement toutes les lignes sauf la dernière.
MYSTERE.
J’ai réussi à bidouiller quelque chose en isolant la dernière ligne, mais ce n’est pas terrible et j’aimerai comprendre d’où vient l’erreur.
Merci de votre aide.

Code :

Code : Tout sélectionner


Global Window_Main

Global Image_0, ListIcon_0, Button_Quitter, Button_Ouvrir_Txt

Procedure OpenWindow_Main(x = 0, y = 0, width = 600, height = 400)
  Window_Main = OpenWindow(#PB_Any, x, y, width, height, "Convertir un fichier TXT en OFX", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIcon_0 = ListIconGadget(#PB_Any, 0, 0, 600, 350, "Date", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  Button_Quitter = ButtonGadget(#PB_Any, 490, 360, 100, 25, "Quitter")
  Button_Ouvrir_Txt = ButtonGadget(#PB_Any, 10, 360, 210, 25, "Ouvrir le fichier " + Chr(34) + "TXT" + Chr(34) + " à convertir")
  AddGadgetColumn(ListIcon_0, 1, "Détail", 310)
  AddGadgetColumn(ListIcon_0, 2, "Débit", 100)
  AddGadgetColumn(ListIcon_0, 3, "Crédit", 100)
EndProcedure

#Separateur = Chr(9) ; tabulation

Procedure LireTxt()
  
  ; Chemin du fichier texte a convertir
  Global CheminFichierTxt$ = OpenFileRequester("Sélectionner le fichier " + Chr(34) + ".TXT " + Chr(34) + " à convertir en " + Chr(34) + ".OFX" + Chr(34) +"", "D:\Mic\Documents\Banque\Ilona\Caisse d'epargne\Import relevés\Pdf et Txt a convertir\", "*.txt|*.txt", 0)
  ; nom du fichier sans extension
  Global NomFichierTxt$ = GetFilePart(CheminFichierTxt$, #PB_FileSystem_NoExtension) 
  If CheminFichierTxt$
    File = ReadFile(#PB_Any, CheminFichierTxt$)
    If File
      While Not Eof(File)
        Line$ = ReadString(File)
        Global   Date$ = StringField(Line$, 1, #Separateur)
        Detail$ = StringField(Line$, 2, #Separateur)
        Debit$ = StringField(Line$, 3, #Separateur)
        Credit$ = StringField(Line$, 4, #Separateur)
        AddGadgetItem(ListIcon_0, 0, Date$ + Chr(10) + Detail$ + Chr(10) + Debit$ + Chr(10) + Credit$)
      Wend
      CloseFile(File)
    Else
      MessageRequester("Information","Impossible d'ouvrir le fichier!")
    EndIf
  EndIf
EndProcedure

Procedure Ecrire_Ofx()
  Global NbLignesListicon_0.i = CountGadgetItems(ListIcon_0) ;Nb lignes
                                                             ; =====================Transforme date en ofx=======================
  date_fr_Start$ = GetGadgetItemText(ListIcon_0, NbLignesListicon_0-1, 0)
  date_Ofx_Start$ = Right(date_fr_Start$, 4) + Mid(date_fr_Start$, 4, 2) + Left(date_fr_Start$, 2)
  
  date_fr_End$ = GetGadgetItemText(ListIcon_0, 0, 0)
  date_Ofx_End$ = Right(date_fr_End$, 4) + Mid(date_fr_End$, 4, 2) + Left(date_fr_End$, 2)
  
  
  Debug date_fr_Start$ + "< Date de DEBUT du fichier texte au format 'Fr' ---------- Dernière ligne du listIcon"
  Debug date_Ofx_Start$ + "<DTSTART> Date de DEBUT pour le format 'Ofx' ---------- normalement 'yyymmdd'"
  
  Debug date_fr_End$ + " Date de FIN du fichier texte au format 'Fr'  ---------- Première ligne du listIcon"
  Debug date_Ofx_End$ + "<DTEND> Date de FIN pour le format 'Ofx' ---------- 'yyymmdd'. Cette ligne est CORRECTE."
  
  Debug "Les autres lignes sont CORRECTES sauf la date de la dernière ligne '<DTEND>' qui devrait être au format 'yyyymmdd'"
  For a = 0 To NbLignesListicon_0 -1
    date_Ofx$ = Right(GetGadgetItemText(ListIcon_0, a, 0), 4) + Mid(GetGadgetItemText(ListIcon_0, a, 0), 4, 2) + Left(GetGadgetItemText(ListIcon_0, a, 0), 2)
    Debug "<STMTTRN>" + Chr(13)
    Debug "<DTPOSTED>" + date_Ofx$ + Chr(13)
    Debug "<NAME>" + GetGadgetItemText(ListIcon_0, a, 1) + Chr(13)
    Debug "<TRNAMT>" + "-" + GetGadgetItemText(ListIcon_0, a, 2) + Chr(13)
    Debug "</STMTTRN>" + Chr(13)
  Next a
  
EndProcedure

Procedure Window_Main_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False
      
    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case  Button_Ouvrir_Txt
          LireTxt()
          Ecrire_Ofx()
          
        Case Button_Quitter
          End
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

OpenWindow_Main()

Repeat 
  event = WaitWindowEvent()
Until Window_Main_Events(event) = #False
Dernière modification par micam le mar. 13/mars/2018 17:53, modifié 1 fois.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Formatage de date d'un ListIconGadget bizarre

Message par Marc56 »

Quand je charge ton exemple, avec les données sauvegardées dans un fichier texte Windows (CRLF) les données sont toutes dans la première colonne de chaque ligne :?
(Edit: Erreur de ma part, j'avais mis un autre séparateur que chr(9) dans le fichier exemple)

:idea: Travailler avec les données stockées dans un gadget n'est pas une méthode fiable, il vaut mieux charger les données depuis le fichier texte dans une liste ou un tableau, puis charger le gadget avec les données de la liste.
L'analyse et transformation des données se faisant sur les éléments du tableau (avec la fonction ForEach() pour les listes)
Le gadget ne servant qu'à afficher et/ou sélectionner une ligne.

Quand je lance ton exemple, j'ai ça en Debug

Code : Tout sélectionner

<STMTTRN>  
<DTPOSTED> 20010615
<NAME>     * COTISATION BOUQUET LIBERTE
<TRNAMT>   -12,12 
</STMTTRN> 

<STMTTRN>  
<DTPOSTED> 20010612
<NAME>     Frais bancaires
<TRNAMT>   -72,12
</STMTTRN> 

<STMTTRN>  
<DTPOSTED> 20010601
<NAME>     VIREMENT PAR INTERNET
<TRNAMT>   -300,00
</STMTTRN> 
Je ne vois pas où est l'erreur ?

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Formatage de date d'un ListIconGadget bizarre

Message par Ar-S »

Oui je serai aussi d'avis de mettre tes lignes de texte dans une Liste Chainée puis de travailler avec cette liste.

J'ajouterai aussi une petite procédure indépendante pour parser les dates.
Il existe 36 façons de faire. En voilà une :

Code : Tout sélectionner

Global Sep$ = Chr(9)

; Liste Chainée
Global NewList F.s()

; Macro pour simplifier le remplissage de la liste
Macro Add2List (string)
  AddElement(f())
  f() = string
EndMacro

; Parsing de la date
Procedure.s ConvtDate(Ligne$)
  Protected A$,M$,J$,date$
  
  date$ = Left(Ligne$,10)
  date$ = RemoveString(date$,"/")
  
  J$ = Left(Ligne$,2)
  M$ = Mid(date$,3,2)
  A$ = Right(date$,4)
  
  ProcedureReturn A$+M$+J$ 
EndProcedure

; Ajout des lignes
Add2List("01/06/2001"+Sep$+"VIREMENT PAR INTERNET"+Sep$+"300,00")
Add2List("12/06/2001"+Sep$+"Frais bancaires"+Sep$+"72,12")
Add2List("15/06/200112,12 "+Sep$+"*"+Sep$+"COTISATION BOUQUET LIBERTE")

; Programme

ForEach F()
  Debug "Ligne à traiter : " + F()  
  Debug "Resultat : " + ConvtDate(F())
Next

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Formatage de date d'un ListIconGadget bizarre

Message par Marc56 »

Voila ton code, mis en mode Liste()
(à optimiser)
Tu verra les commandes FirstElement() et LastElement() et surtout l'excellent ForEach()

Code : Tout sélectionner

Global Window_Main

Global Image_0, ListIcon_0, Button_Quitter, Button_Ouvrir_Txt

Procedure OpenWindow_Main(x = 0, y = 0, width = 600, height = 400)
     Window_Main = OpenWindow(#PB_Any, x, y, width, height, "Convertir un fichier TXT en OFX", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
     ListIcon_0 = ListIconGadget(#PB_Any, 0, 0, 600, 350, "Date", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
     Button_Quitter = ButtonGadget(#PB_Any, 490, 360, 100, 25, "Quitter")
     Button_Ouvrir_Txt = ButtonGadget(#PB_Any, 10, 360, 210, 25, "Ouvrir le fichier " + Chr(34) + "TXT" + Chr(34) + " à convertir")
     AddGadgetColumn(ListIcon_0, 1, "Détail", 310)
     AddGadgetColumn(ListIcon_0, 2, "Débit", 100)
     AddGadgetColumn(ListIcon_0, 3, "Crédit", 100)
EndProcedure

#Separateur = Chr(9) ; tabulation

Procedure LireTxt()
     ; Chemin du fichier texte a convertir
     Global CheminFichierTxt$ = OpenFileRequester("Sélectionner le fichier " + Chr(34) + ".TXT " + Chr(34) + " à convertir en " + Chr(34) + ".OFX" + Chr(34) +"", "D:\Mic\Documents\Banque\Ilona\Caisse d'epargne\Import relevés\Pdf et Txt a convertir\", "*.txt|*.txt", 0)
     ; nom du fichier sans extension
     If CheminFichierTxt$
          File = ReadFile(#PB_Any, CheminFichierTxt$)
          Global NewList All_Lines.s()
          If File
               While Not Eof(File)
                    AddElement(All_Lines())
                    All_Lines() = ReadString(File)
               Wend
               ForEach All_Lines()
                    Date$   = StringField(All_Lines(), 1, #Separateur)
                    Detail$ = StringField(All_Lines(), 2, #Separateur)
                    Debit$  = StringField(All_Lines(), 3, #Separateur)
                    Credit$ = StringField(All_Lines(), 4, #Separateur)
                    AddGadgetItem(ListIcon_0, 0, Date$ + Chr(10) + Detail$ + Chr(10) + Debit$ + Chr(10) + Credit$)   
               Next               
               CloseFile(File)
          Else
               MessageRequester("Information","Impossible d'ouvrir le fichier!")
          EndIf
     EndIf
EndProcedure

Procedure Ecrire_Ofx()
     Protected NbLignesListicon_0.i = ListSize(All_Lines()) ;Nb lignes
                                                            ; =====================Transforme date en ofx=======================
     
     FirstElement(All_Lines())
     date_fr_Start$  = Left(All_Lines(), 10) 
     date_Ofx_Start$ = Mid(All_Lines(), 7, 4) + Mid(All_Lines(), 4, 2) + Left(All_Lines(), 2)
     
     LastElement(All_Lines())
     date_fr_End$    = Left(All_Lines(), 10)
     date_Ofx_End$   = Mid(All_Lines(), 7, 4) + Mid(All_Lines(), 4, 2) + Left(All_Lines(), 2)
     
     
     Debug date_fr_Start$ + "< Date de DEBUT du fichier texte au format 'Fr' ---------- Dernière ligne du listIcon"
     Debug date_Ofx_Start$ + "<DTSTART> Date de DEBUT pour le format 'Ofx' ---------- normalement 'yyymmdd'"
     
     Debug date_fr_End$ + " Date de FIN du fichier texte au format 'Fr'  ---------- Première ligne du listIcon"
     Debug date_Ofx_End$ + "<DTEND> Date de FIN pour le format 'Ofx' ---------- 'yyymmdd'. Cette ligne est CORRECTE."
     
     Debug "Les autres lignes sont CORRECTES sauf la date de la dernière ligne '<DTEND>' qui devrait être au format 'yyyymmdd'"
     
     ForEach All_Lines()
          date_Ofx$ = Mid(All_Lines(), 7, 4) + Mid(All_Lines(), 4, 2) + Left(All_Lines(), 2) 
          Debug ""
          Debug "<STMTTRN>  " + Chr(13)
          Debug "<DTPOSTED> " + date_Ofx$  + Chr(13)
          Debug "<NAME>" + GetGadgetItemText(ListIcon_0, a, 1) + Chr(13)
          Debug "<TRNAMT>" + "-" + GetGadgetItemText(ListIcon_0, a, 2) + Chr(13)
          Debug "</STMTTRN>" + Chr(13)
     Next

EndProcedure

Procedure Window_Main_Events(event)
     Select event
          Case #PB_Event_CloseWindow
               ProcedureReturn #False
               
          Case #PB_Event_Menu
               Select EventMenu()
               EndSelect
               
          Case #PB_Event_Gadget
               Select EventGadget()
                    Case  Button_Ouvrir_Txt
                         LireTxt()
                         Ecrire_Ofx()
                         
                    Case Button_Quitter
                         End
               EndSelect
     EndSelect
     ProcedureReturn #True
EndProcedure

OpenWindow_Main()

Repeat
     event = WaitWindowEvent()
Until Window_Main_Events(event) = #False
Maintenant, on peut aussi le faire en JSON, avec un tableau 2D, avec une base SQLite etc
PB permet de faire la même chose de plein de façons sympa
(moi c'est les RegEx mon hobby/gagne pain)
:wink:
micam
Messages : 46
Inscription : ven. 27/avr./2012 15:29

Re: Formatage de date d'un ListIconGadget bizarre

Message par micam »

Bonjour Marc56.
J'ai trouvé le problème. Mon fichier texte était encodé en UTF8.
J'ai changé l'encodage en UTF8(sans bom) avec notepad++ et tout fonctionne.
J'ai suivi ton conseil et utilisé une liste, mais j'avais toujours le même problème.
Cela venait bien de l'encodage.
Merci de ton aide.
micam
Messages : 46
Inscription : ven. 27/avr./2012 15:29

Re: Formatage de date d'un ListIconGadget bizarre

Message par micam »

Bonjour Ar-S et Marc56.
J'ai encore appris quelques trucs.
Merci à vous deux.
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Formatage de date d'un ListIconGadget bizarre

Message par Marc56 »

Parfait. Merci du retour :P

PS.
:idea: PB dispose de la fonction ReadStringFormat() qui permet de détecter l'encodage et ensuite de passer le bon paramètre aux commandes de fichiers, donc de se dispenser de passer par un programme intermédiaire.

:wink:
Répondre