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]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]

