export via fichier *.QIF [Réglé]
besoin d'un petit script ?
Logiciels / Bureautique

bal1 Membre non connecté
-
- Voir le profil du membre bal1
- Inscrit le : 22/01/2013
- Groupes :
Jusqu'à Mageia 6, l'export se faisait en csv sans problême. A partir du passage en 6.1, patatras :l'export se fait en format QIF spécial flux financier.
L'équipe d' HomeBank répond que le CSV est un format pourri, hors du QIF point de salut!
En CSV :Une transaction se faisait sur 7 éléments soit 7 champs avec un séparateur " ;" et constituait une ligne de fichier avec une fin de ligne classique
En QIF le séparateur de champs est un retour chariot ! donc un champ par ligne ( sympa pour un tableur)
J'ai tenté un script par sed ou awk pour remplacer 6 sur 7 des fins de lignes par ";" : ça dépasse largement mes compétences malgré les tutos de Funix.
Il semble que le fin de ligne soit un élément vraiment différend des autres.
Un champion du script est_il intéréssé ? ou une autre solution ?
fichier_qif.txt

Alain
Tour Dell [Intel I7 Ghz RAM 16 Go SSD 300 Go HDD 600 Go]
Mageïa 9 x86-64 bureau Xfce4

Papoteur Membre non connecté
-
- Voir le profil du membre Papoteur
- Inscrit le : 03/10/2011
- Groupes :
-
Modérateur
-
Équipe Mageia
-
Administrateur
-
Forgeron
Je verrais bien un script en Python.
Code PYTHON :
with open("fichier_qif.txt", 'r') as f: for l in f.readlines(): if l == '^': print("\n") else: print("%s;"%l)
J'ai supposé que le changement de ligne était avec le caractère ^
La sortie se fait là dans la console.
Pour récupérer dans un fichier :
python3 programme.py >fichier.csv
Voilà, en 5 minutes.
Édité par Papoteur Le 27/04/2019 à 22h48
Yves

bal1 Membre non connecté
-
- Voir le profil du membre bal1
- Inscrit le : 22/01/2013
- Groupes :
J'ai de Python une petite approche très lointaine : peux tu m'expliquer la partie else : print("%s;"%l) ; quid de "%s ?
J'espère trouver l'équivalent dans mon langage habituel.

Alain
Tour Dell [Intel I7 Ghz RAM 16 Go SSD 300 Go HDD 600 Go]
Mageïa 9 x86-64 bureau Xfce4

nic80 Membre non connecté
-
- Voir le profil du membre nic80
- Inscrit le : 06/08/2018
- Groupes :
-
Modérateur
Pour ce que je comprends, on ouvre le fichier puis on crée une variable de type liste nommée l ( contenant l' ensemble des lignes du fichier).
Si la ligne contient le caractère ^, alors on "affiche" le caractère retour à la ligne ( \n), sinon on affiche la ligne suivie du caractère ";" ( %s pour indiquer que ce que l' on va ajouter est une chaine de caractère ( ce qu' est effectivement la variable l)
Après je connais pas Python du tout...
Édité par nic80 Le 28/04/2019 à 09h40

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Désolé, mais il manque plus d'informations.
Je viens de regarder le fichier, mais j'ai un peu de mal à l'analyser.
J'ai l'impression qu'il y a plusieurs colonnes vides, n'est-ce pas ?
D'après ce que j'ai compris :
! | D | N | T | C | P | M | L |
Account | vide | Bank account 0430527C025 | BANK | vide | vide | vide | vide |
Type:Bank | 02/05/2014 | vide | -203.70 | vide | vide | VIREMENT POUR | vide |
vide | 02/05/2014 | vide | 152.58 | vide | CREPA | VIREMENT DE CREPA-REP | revenu |
vide | 05/05/2014 | vide | -123.83 | vide | MEDERIC | PRELEVEMENT DE Malakoff Mederic | santé |
vide | 05/05/2014 | vide | -59.97 | vide | FT | PRELEVEMENT DE Orange | maison |
Est-ce bien ce genre de tableau que tu veux récupérer à travers un CSV ?
Dans ce cas, il faut revoir les scripts du dessus pour rajouter les cases vides.
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

magnux77 Membre non connecté
-
- Voir le profil du membre magnux77
- Inscrit le : 21/09/2009
- Groupes :
-
Membre d'Honneur
Pour ne pas réinventer l'eau tiède, d'après ce site, gnucash qui est dans les dépôts Mageia kiffe le qif. Et tu as aussi QIF Converter (une bouse en Java) à downloader.
Édité par magnux77 Le 28/04/2019 à 13h49
...depuis Mandrake 7
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]

bal1 Membre non connecté
-
- Voir le profil du membre bal1
- Inscrit le : 22/01/2013
- Groupes :
Jybz : il s'agit effectivement d'obtenir le tableau que tu montre sans la 1ere colonne et la ligne 'account' mais elles peuvent sauter rapidement lors de l'import du fichier CSV dans un tableur.

Alain
Tour Dell [Intel I7 Ghz RAM 16 Go SSD 300 Go HDD 600 Go]
Mageïa 9 x86-64 bureau Xfce4

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Alors, il y a de manière générale deux solutions possible :
- Bâcler (Vite fait bien fait)
- Bien faire (prend bien plus de temps).
La première solution, on commence par supprimer le début de fichier (jusqu'à la première ligne D), on perdra ainsi la première ligne du tableau, et nous ne nous occuperons plus de la première colonne qui n'est jamais présente.
Puis, on supprimerait tous les retours à la ligne, qu'on remplacerait avec des ";" avec la commande TR.
D'après ton fichier, la colonne des dates n'est JAMAIS vide, donc on vient rechercher dans tout le fichier (qui ne fait plus qu'une ligne) chaque occurrence ^;D puis on remplace par \n^;D (donc une nouvelle ligne avant le ^;D)
Nous avons chaque ligne commençant par la date, mais nous avons perdu une information, l'entête, et nous ne recouvreront pas la première colonne.
Ce qui est "bien", c'est qu'on peut considérer le ";" comme un "méta-caractère", donc on peut rechercher les colonnes manquante.
Par exemple, on recherche ;N après D, si c'est autre chose, alors on reprend ;D... puis on rajoute ;N (vide), puis on remet le reste, et on réitère, avec ;N..., si après ; on n'a pas T, on rajoute T;, etc etc. Ça se fait assez tranquillement avec SED, même si Magnux est un maître en AWK !
Seconde version, similaire, mais on ne supprime pas la première "ligne", et on tente de rajouter la première colonne lorsqu'elle est manquante. Plus ou moins avec la même logique.
Tu nous fait ça, on te corrige ?
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Papoteur Membre non connecté
-
- Voir le profil du membre Papoteur
- Inscrit le : 03/10/2011
- Groupes :
-
Modérateur
-
Équipe Mageia
-
Administrateur
-
Forgeron
bal1 :
merci, Papoteur.
J'ai de Python une petite approche très lointaine : peux tu m'expliquer la partie else : print("%s;"%l) ; quid de "%s ?
J'ai de Python une petite approche très lointaine : peux tu m'expliquer la partie else : print("%s;"%l) ; quid de "%s ?
Quel est ton langage habituel ?
Si readlines fournit une collection de lignes, et le boucle for épluche cette collection ligne par ligne dans la variable l.
Une variable l est un champ.
"%s;" est le modèle de ce qu'on sort. %s désigne le format chaîne de caractère est est substitué par le contenu de la variable l, puis suivi par le caractère ;
Yves

bal1 Membre non connecté
-
- Voir le profil du membre bal1
- Inscrit le : 22/01/2013
- Groupes :
J'ai démarré trop vite et je m'aperçois que le nombre de données d'une transaction peut varier : apparition d'un champ N de temps en temps.
Ce champ ne m'intéresse pas : je vais donc le supprimer : il faut que j'analyse le début de chaque champ pour maintenir la longueur de l'enregistrement (indispensable pour la cohésion du tableur).
Je m'oriente vers la suppression des lignes d'en-tête puis une seule lecture/écriture avec l'analyse et l'adaption complète de chaque élément lu. Je dois aussi supprimer la 1ere lettre de chaque ligne lu car elle est incompréhensible pour le tableur. Donc un programme éxécutable .
Magnus77 : J'ai essayé GNUCASH, il plante chez moi sur l'import de fichier QIF en provenance de HomeBank et son approche est trop comptable pour moi. Tant qu'à avoir une bouze autant essayer de faire la mienne.
Papoteur : désolé car je ne vois toujours pas comment est injecté le caractère ;
Je m'amuse depuis quelques années avec le langage Eiffel orienté objet comme Python.

Alain
Tour Dell [Intel I7 Ghz RAM 16 Go SSD 300 Go HDD 600 Go]
Mageïa 9 x86-64 bureau Xfce4

bal1 Membre non connecté
-
- Voir le profil du membre bal1
- Inscrit le : 22/01/2013
- Groupes :
J'arrive au traitement suivant façon Eiffel
from début du fichier
until fin du fichier
loop
- lire une ligne du fichier QIF (donc un champ)
- analyser le 1er caractère selon la valeur : ne rien faire ou traiter le contenu
end
traiter le contenu :
- si 1er caractère = ^ -> écrire une ligne de sortie
- sinon supprimer le 1er caractère et ranger le reste dans une variable choisie selon la valeur du 1er caractère
écrire la ligne de sortie : (avec les variables dans l'ordre correcte donné par list_var)
from list_var.start
until list_var.exhausted
loop
écrire l'item de list_var le fichier CSV
if dernier item
écrire 'fin de ligne'
else
écrire ';'
end
list_var.forth
end
Édité par bal1 Le 29/04/2019 à 10h30

Alain
Tour Dell [Intel I7 Ghz RAM 16 Go SSD 300 Go HDD 600 Go]
Mageïa 9 x86-64 bureau Xfce4

Papoteur Membre non connecté
-
- Voir le profil du membre Papoteur
- Inscrit le : 03/10/2011
- Groupes :
-
Modérateur
-
Équipe Mageia
-
Administrateur
-
Forgeron
Si tu établis un cahier des charges, il faut que tu précises la liste complète des colonnes que tu veux et quel est le premier caractère qui y correspond.
Yves

Papoteur Membre non connecté
-
- Voir le profil du membre Papoteur
- Inscrit le : 03/10/2011
- Groupes :
-
Modérateur
-
Équipe Mageia
-
Administrateur
-
Forgeron
Code PYTHON :
with open("fichier_qif.txt", 'r') as f: debut = True nouvelle_ligne = True for l in f.readlines(): if nouvelle_ligne: #on initialise la variable contenant une ligne de sortie à chaque début de ligne nouvelle_ligne = False sortie = {'D':'','T':'', 'C':'', 'P':'', 'M':'', 'L':''} if l[:1] == "^": # On a atteint la fin de la (première) ligne # Fin de la ligne, on la sort if debut: debut = False else: print("{D};{T};{C};{P};{M};{L}".format(D=sortie['D'],T=sortie['T'],C=sortie['C'],P=sortie['P'],M=sortie['M'],L=sortie['L'],)) nouvelle_ligne = True else: sortie[l[:1]] = l[1:-1]
Yves

magnux77 Membre non connecté
-
- Voir le profil du membre magnux77
- Inscrit le : 21/09/2009
- Groupes :
-
Membre d'Honneur
bal1 :
S'amuser est un bien grand mot sans doute. J'ai souvenir au contraire d'un langage plus que sérieux. Trop sérieux et beaucoup trop rigoureux pour moi en tout cas, surtout pour mes modestes besoins ou m'amuser. Mais respect, bal1 !
Je m'amuse depuis quelques années avec le langage Eiffel
...depuis Mandrake 7
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]
Membre de l'April - « promouvoir et défendre le Logiciel Libre»
Soutien Framasoft - « Changer le monde, un octet à la fois»
Config n°1 : cpu=AMD64x6 mem=16G SSD=64G HDD=1T OS=Mageia8-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia8 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia8/Xfce]

bal1 Membre non connecté
-
- Voir le profil du membre bal1
- Inscrit le : 22/01/2013
- Groupes :
"je m'amuse" signifie que je ne fais rien de sérieux avec Eiffel, juste se frotter à l'application rugueuse de principes de programmation modernes : peut être un brin de masochisme ?
J'ai raté l'attachement du fichier 'cahier des charges' annoncé : heureusement car il est inexact !
Avec mes premières tentatives, je m'aperçois que la structure est plus complexe avec l'apparition de temps en temps d'une valeur N supplémentaire entre C et P.
Je mets au point et je renvoie.

Alain
Tour Dell [Intel I7 Ghz RAM 16 Go SSD 300 Go HDD 600 Go]
Mageïa 9 x86-64 bureau Xfce4
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie