PureBasic

Forums PureBasic
Nous sommes le Mer 23/Oct/2019 19:16

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 7 messages ] 
Auteur Message
 Sujet du message: [Résolu]Formatage de date d'un ListIconGadget bizarre
MessagePosté: Mar 13/Mar/2018 15:36 
Hors ligne

Inscription: Ven 27/Avr/2012 15:29
Messages: 46
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:

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 édition par micam le Mar 13/Mar/2018 17:53, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Formatage de date d'un ListIconGadget bizarre
MessagePosté: Mar 13/Mar/2018 15:59 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1619
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:
<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:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Formatage de date d'un ListIconGadget bizarre
MessagePosté: Mar 13/Mar/2018 17:12 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8769
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:
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 :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Formatage de date d'un ListIconGadget bizarre
MessagePosté: Mar 13/Mar/2018 17:40 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1619
Voila ton code, mis en mode Liste()
(à optimiser)
Tu verra les commandes FirstElement() et LastElement() et surtout l'excellent ForEach()
Code:
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:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Formatage de date d'un ListIconGadget bizarre
MessagePosté: Mar 13/Mar/2018 17:44 
Hors ligne

Inscription: Ven 27/Avr/2012 15:29
Messages: 46
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Formatage de date d'un ListIconGadget bizarre
MessagePosté: Mar 13/Mar/2018 17:51 
Hors ligne

Inscription: Ven 27/Avr/2012 15:29
Messages: 46
Bonjour Ar-S et Marc56.
J'ai encore appris quelques trucs.
Merci à vous deux.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Formatage de date d'un ListIconGadget bizarre
MessagePosté: Mar 13/Mar/2018 17:52 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1619
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:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 7 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Christophe, Google [Bot] et 3 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye