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

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
jcbx
Niveau 1
Niveau 1
Messages : 8
Enregistré le : mar. 02 août 2011 19:09
Status : Hors ligne

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

#1

Message 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é 197 fois
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#2

Message 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
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
jcbx
Niveau 1
Niveau 1
Messages : 8
Enregistré le : mar. 02 août 2011 19:09
Status : Hors ligne

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

#3

Message 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é.
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#4

Message 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 ^.^
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
jcbx
Niveau 1
Niveau 1
Messages : 8
Enregistré le : mar. 02 août 2011 19:09
Status : Hors ligne

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

#5

Message par jcbx »

Merci pour cette relecture attentive :)

C'est extrèmement frustrant de voir des gens manipuler Regexp avec autant d'aisance :evil:
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#6

Message 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
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
jcbx
Niveau 1
Niveau 1
Messages : 8
Enregistré le : mar. 02 août 2011 19:09
Status : Hors ligne

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

#7

Message 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...
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#8

Message par PandiPanda »

ha bon?
pourtant ceci fonctionne très bien ...
► Afficher le texte
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
jcbx
Niveau 1
Niveau 1
Messages : 8
Enregistré le : mar. 02 août 2011 19:09
Status : Hors ligne

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

#9

Message 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
Répondre