Page 1 sur 1

[EX] Script personnalisé pour fichiers QIF banque en ligne

Posté : ven. 05 août 2011 17:53
par jcbx
Bonjour à tous,

voici mon premier script Autoit, et je le partage. A priori peu de ré-utilisation possible pour d'autres personnes, mais je suis curieux d'obtenir vos remarques sur mon "travail" : trop de variables ? boucle non adaptée ? etc...
N'hésitez pas à être critique.

Concernant son utilité (pour moi en tout cas) : ma banque en ligne me fournit un fichier QIF, que je télécharge, pour l'importer dans mon outil de gestion (Acemoney, pour info). Or, dans ce fichier QIF (je joindrai un exemple), la date d'une même opération donnée peut différer entre deux champs différents. Comme il est important pour moi de conserver une cohérence, voilà ce que fait mon script :
il parcourt toutes les lignes du fichier QIF, et quand il trouve une incohérence entre les dates, il prend la deuxième et remplace la première. A noter qu'en plus, le premier champ date est dans un format, et l'autre date dans un autre.

Bref, comme je vous le disais, c'est un besoin très très spécifique. Mais comme c'est premier script, et que j'ai découvert Autoit, je pense qu'il y a des choses à améliorer (notamment le stringregexp que je n'ai pas réussi à faire fonctionner, cf commentaire dans le code.)

Enfin, merci pour les infos sur ce forum qui en plus du tutoriel sur le siteduzero m'ont dépanné par moments.

Pour les caractères spéciaux, c'est suite à l'ouverture de mon fichier .au3 dans Autoit debugger :(

Code : Tout sélectionner

[spoiler=]#include <Array.au3>
#include <GUIConstantsEx.au3>
#Include <File.au3>

$GUI = GUICreate("MAJ fichier QIF",400, 300)
$Bouton1 = GUICtrlCreateButton("1 Choisir le fichier", 50, 100)
$Bouton2 = GUICtrlCreateButton("2 Lancer les changements", 150, 100)

GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
                Exit
        Case $Bouton1
            $message = "Fichier QIF � s�lectionner"
            $fichier = FileOpenDialog($message, @DocumentsCommonDir & "\", "type (*.qif)", 1 + 4 )
            If @error Then
                MsgBox(4096,"","Pas de fichier s�lectionn�")
            Else
                FileRead($fichier)
                $NBlignesfichier = _FileCountLines($fichier)
            EndIf

        Case $Bouton2
        fonction_lire_ligne($NBlignesfichier)


    EndSwitch
WEnd

Func fonction_lire_ligne($NBlignesfichier)
    Dim $date_D,$date_P,$nombre_de_lignes
    For $i = 1 to $NBlignesfichier step 1
    ;For $i = 1 to 21 step 1
        $chainecar = filereadline($fichier,$i)
        $premcar = stringleft($chainecar,1)
        ;$premcar = StringRegExp($chainecar,"^(.{1})") : pourquoi �a ne fonctionne pas ?!
        Switch $premcar
        case "!"
            ;premi�re ligne du fichier, on zappe
        case "D"
            ;c'est une ligne de date, format MM/JJ/AAAA
            $date_D = tableau_date_D($chainecar,$i)

        case "P"
            ;ligne de d�tail du paiement : on r�cup�re la date que cette ligne contient
            $date_P = tableau_date_P($chainecar,$i)

            ;on compare les deux dates
            $nombre_de_lignes = comparaison_tableau_dates($date_D,$date_P,$i,$nombre_de_lignes)
        case "T"
            ;c'est le montant, on ne touche � rien
        case "M"
            ;derni�re ligne du "groupe", on n'y touche pas
        case "^"
            ;caract�re fin du "groupe", on n'y touche pas
        endSwitch
Next
        msgbox(0,"Fin de la modification du fichier","Fichier mis à jour, nb lignes : "& $nombre_de_lignes)
        FileClose($fichier)
EndFunc

Func comparaison_tableau_dates($date_D,$date_P,$i,$nombre_de_lignes)
;premi�re �tape : la date P doit avoir le m�me format que la date D (ou l'inverse...) :
_ArrayReverse($date_D,0,1) ; passage au format DDMMAAAA
;maintenant on compare ces deux tableaux transform�s en cha�nes de caract�res
$resultat = stringcompare(_ArrayToString($date_D),_ArrayToString($date_P),0)
switch $resultat
    case "0" ; identique
        ;on ne fait rien

    case Else ; diff�rent
        ;reconstruction de la date pour le fichier pour une ligne type D, format DMM/DD/AAAA
        _ArrayReverse($date_P,0,1)
        $newdateD = "D"&_arraytostring($date_P,"/")
        ;il faut remplacer dans la ligne $i-2 la date
        ;fonction qui permet d'�crire dans le fichier � la ligne voulue et indiqu�e
        _FileWritetoLine($fichier,$i-2,$newdateD,1)
        $nombre_de_lignes += 1
        return $nombre_de_lignes

EndSwitch

EndFunc


Func tableau_date_P($chainecar,$i)
;dans cette fonction, on r�cup�re la chaine de caract�res, on extrait la date, puis on la stocke dans un tableau
Dim $tableau_date_P[3]
$texte = stringleft($chainecar,6)
switch $texte
    case "PCARTE"
        $texte = StringTrimLeft($chainecar,7)
;on vire les x premiers caract�res, et on met la date dans le tableau
;et on renvoie le tableau � la fin
$tableau_date_P[0] = (stringleft($texte,2))
$texte = StringTrimLeft($texte,3)
$tableau_date_P[1] = (stringleft($texte,2))
$texte = StringTrimLeft($texte,3)
$tableau_date_P[2] = (stringleft($texte,4))
return $tableau_date_P

    case "PCHEQU"
        ;$texte = StringTrimLeft($chainecar,8)
        ;rien pour l'instant, � faire plus tard : r�cup�rer le num�ro de ch�que, puis cr�er une ligne dans le fichier pour automatiser l'insertion de ce num�ro
EndSwitch

EndFunc


Func tableau_date_D($chainecar,$i)
;fonction pour stocker dans un tableau la date de la ligne de type Date du fichier QIF
Dim $tableau_date_D[3]
;on supprime le D qui pr�c�de la date
$chainecar = StringTrimLeft($chainecar,1)
; on remplit le tableau
$tableau_date_D[0] = (stringleft($chainecar,2))
$chainecar = StringTrimLeft($chainecar,3)
$tableau_date_D[1] = (stringleft($chainecar,2))
$chainecar = StringTrimLeft($chainecar,3)
$tableau_date_D[2] = (stringleft($chainecar,4))
return $tableau_date_D

EndFunc[/spoiler]
Exemple de fichier QIF :

Code : Tout sélectionner

[spoiler=]!Type:Bank
D07/28/2011
T-8.35
PCARTE 23/07/2011 IVAC
M
^
D07/28/2011
T-52.07
PCARTE 26/09/2011 AUCHAN
M
^
D07/28/2011
T-21.90
PCARTE 26/07/2011 PIZZA HUT
M
^
D07/26/2011
T-75.34
PCARTE 23/07/2011 PHARMACIE
M
^
D07/26/2011
T-150.71
PCARTE 23/07/2011 CABINET MEDICAL
M
^
D07/22/2011
T-7.00
PCHEQUE 0418055
M
^
D07/21/2011
T-26.50
PCARTE 16/07/2011 AUTOROUTE DU SUD
M
^
D07/20/2011
T-9.80
PCARTE 16/07/2011 A.R.E.A.
M
^
D07/20/2011
T-15.80
PCARTE 16/07/2011 APRR AUTOROUTE
M
^
D07/19/2011
T-10.23
PCARTE 15/07/2011 AUCHAN
M
^
D07/19/2011
T-9.61
PCARTE 15/07/2011 CARREFOUR
M
^
D07/19/2011
T-7.22
PCARTE 15/07/2011 PHARMACIE MERIAD
M
^
D07/18/2011
T-45.00
PCARTE 13/07/2011 ASSURANCES
M
^
D07/18/2011
T-60.00
PRETRAIT 13/07/2011 DAB DE LA BANQUE POSTALE[/spoiler]
Production.au3
(4.13 Kio) Téléchargé 200 fois

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : ven. 05 août 2011 18:02
par PandiPanda
J'ai survoler le code, et je voit déja un problème '^^

si vous faites ceci; clicker sur "choisir le fichier", ensuite clicker sur annuler. Apres vous faites lancer les changements, et hop un joli message d'erreur ^^
De même si vous lancer directement sur le bouton 2 "lancer les changements" sans passer par le choix du fichier

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : ven. 05 août 2011 18:10
par jcbx
Pour le coup de l'annulation, non ça ne plante pas, en tout cas pas chez moi.
Par contre, oui, si on lance le bouton 2 sans avoir sélectionné de fichier, ça plante.

A voir si je corrige ou pas, comme je disais, c'est un script très perso. C'est surtout sur la partie algo que j'attends des remarques ;)

Mais si je corrige en V2, pour la gestion des chèques, notamment, je posterai la correction du point 2 que tu as levé.

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : ven. 05 août 2011 18:45
par PandiPanda
En regardans plus profondément, je vois quelque amélioration ^^

Notamment pour le coup du StringRegEx();

Code : Tout sélectionner

        $premcar = StringRegExp($chainecar,"(^.{1})",1) ; pourquoi ?a ne fonctionne pas ?!
        Switch $premcar[0]
ceci aussi;
► Afficher le texte
remplacable par ceci, qui fait exactement la même chose;

Code : Tout sélectionner

Func tableau_date_P($chainecar)
    Return StringRegExp($str,"(?:\d{2,4})",3); pour le PCHEQUE; si c'est toujours 7 chiffre, vous pouvez modifié {2,4} par {2,7}
EndFunc
Func tableau_date_P & Func tableau_date_D font la même chose donc c'est valable pour les 2 :P

Je regarde la suite ^.^

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : ven. 05 août 2011 20:01
par jcbx
Merci pour cette relecture attentive :)

C'est extrèmement frustrant de voir des gens manipuler Regexp avec autant d'aisance :evil:

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : ven. 05 août 2011 20:16
par PandiPanda
Je suis un grand débutant avec les regexp
mais j'ai un petit utilitaire qui permet de les vérifier, ce qui m'aide beaucoup ^^

ici

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : sam. 06 août 2011 11:48
par jcbx
PandiPanda a écrit :En regardans plus profondément, je vois quelque amélioration ^^

Notamment pour le coup du StringRegEx();

Code : Tout sélectionner

        $premcar = StringRegExp($chainecar,"(^.{1})",1) ; pourquoi ?a ne fonctionne pas ?!
        Switch $premcar[0]
Après test, ton stringregexp ne renvoie rien, en fait...

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : sam. 06 août 2011 12:28
par PandiPanda
ha bon?
pourtant ceci fonctionne très bien ...
► Afficher le texte

Re: [EX] Script personnalisé pour fichiers QIF banque en lig

Posté : sam. 06 août 2011 13:08
par jcbx
J'ai trouvé pourquoi il ne renvoie rien chez moi. Je n'avais pas mis d'indice, puisque la variable est un tableau (je n'avais pas prévu ça, d'ailleurs...)
Il faut que je vois comment ça va marcher pour le cas du chèque, du coup.

Merci, en tout cas :D