Connexion

Forum

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

bal1 Membre non connecté

Rang

Avatar

Inscrit le : 22/01/2013 à 20h26

Localisation : Besançon - France

Messages: 284

Le 27/04/2019 à 21h02
J'utilise homebank depuis 2009 et j'exporte les données dans LibreOffice pour une analyse personnalisée.
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


:merci:
Alain
Tour LDLC Frakass [CM :ASROCK H81M-HDS Celeron 2800 Ghz RAM 4 Go SSD 120 Go HDD 160 Go]
Mageïa 6 x86-64 bureau Xfce4 + VirtualBox Mageïa 6 x86-64 bureau LXQT
   
Papoteur Membre non connecté

Rang

Avatar

Modérateur Équipe Mageia

Inscrit le : 03/10/2011 à 22h16

Localisation : Metz

Messages: 6724

Le 27/04/2019 à 22h39
Bonjour,
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. Edité par Papoteur Le 27/04/2019 à 22h48


Yves
   
bal1 Membre non connecté

Rang

Avatar

Inscrit le : 22/01/2013 à 20h26

Localisation : Besançon - France

Messages: 284

Le 28/04/2019 à 09h04
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'espère trouver l'équivalent dans mon langage habituel.


:merci:
Alain
Tour LDLC Frakass [CM :ASROCK H81M-HDS Celeron 2800 Ghz RAM 4 Go SSD 120 Go HDD 160 Go]
Mageïa 6 x86-64 bureau Xfce4 + VirtualBox Mageïa 6 x86-64 bureau LXQT
   
nic80 Membre non connecté

Rang

Avatar

Inscrit le : 06/08/2018 à 23h52

Messages: 1429

Le 28/04/2019 à 09h39
Bonjour,

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

Edité par nic80 Le 28/04/2019 à 09h40
   
Jybz Membre non connecté

Rang

Avatar

Modérateur

Inscrit le : 10/10/2018 à 10h26

Messages: 1859

Le 28/04/2019 à 10h45
Humm...

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.
   
magnux77 Membre non connecté

Rang

Avatar

Inscrit le : 21/09/2009 à 11h49

Localisation : Champs-sur-Marne France

Messages: 5038

Le 28/04/2019 à 13h40
Hi alp1 !

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. Edité 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=Mageia7-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia7 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia6/Xfce]
   
bal1 Membre non connecté

Rang

Avatar

Inscrit le : 22/01/2013 à 20h26

Localisation : Besançon - France

Messages: 284

Le 28/04/2019 à 15h14
Hi magnus77 : il y a eau plus ou moins tiède, il faut choisir la température. Je vais voir tes solutions mais j'aimerais bien aboutir sur cette idée de script (pour le fun).

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.


:merci:
Alain
Tour LDLC Frakass [CM :ASROCK H81M-HDS Celeron 2800 Ghz RAM 4 Go SSD 120 Go HDD 160 Go]
Mageïa 6 x86-64 bureau Xfce4 + VirtualBox Mageïa 6 x86-64 bureau LXQT
   
Jybz Membre non connecté

Rang

Avatar

Modérateur

Inscrit le : 10/10/2018 à 10h26

Messages: 1859

Le 28/04/2019 à 15h38
Ok !

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 ?
   
Papoteur Membre non connecté

Rang

Avatar

Modérateur Équipe Mageia

Inscrit le : 03/10/2011 à 22h16

Localisation : Metz

Messages: 6724

Le 28/04/2019 à 16h42
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 ?

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é

Rang

Avatar

Inscrit le : 22/01/2013 à 20h26

Localisation : Besançon - France

Messages: 284

Le 28/04/2019 à 21h08
Comme dis Jybz bacler vite ou réflêchir un peu
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.



:merci:
Alain
Tour LDLC Frakass [CM :ASROCK H81M-HDS Celeron 2800 Ghz RAM 4 Go SSD 120 Go HDD 160 Go]
Mageïa 6 x86-64 bureau Xfce4 + VirtualBox Mageïa 6 x86-64 bureau LXQT
   
bal1 Membre non connecté

Rang

Avatar

Inscrit le : 22/01/2013 à 20h26

Localisation : Besançon - France

Messages: 284

Le 29/04/2019 à 10h10
J'ai rédiger mon cahier des charges et je le joins pour ceux que ça peut intéresser.
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
Edité par bal1 Le 29/04/2019 à 10h30


:merci:
Alain
Tour LDLC Frakass [CM :ASROCK H81M-HDS Celeron 2800 Ghz RAM 4 Go SSD 120 Go HDD 160 Go]
Mageïa 6 x86-64 bureau Xfce4 + VirtualBox Mageïa 6 x86-64 bureau LXQT
   
Papoteur Membre non connecté

Rang

Avatar

Modérateur Équipe Mageia

Inscrit le : 03/10/2011 à 22h16

Localisation : Metz

Messages: 6724

Le 29/04/2019 à 12h36
Salut,
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é

Rang

Avatar

Modérateur Équipe Mageia

Inscrit le : 03/10/2011 à 22h16

Localisation : Metz

Messages: 6724

Le 29/04/2019 à 13h49
Voici un exemple plus précis, et vérifié :
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é

Rang

Avatar

Inscrit le : 21/09/2009 à 11h49

Localisation : Champs-sur-Marne France

Messages: 5038

Le 29/04/2019 à 14h17
bal1 :
Je m'amuse depuis quelques années avec le langage Eiffel
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 !


...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=Mageia7-64 DE=Xfce, Config n°2 : Dell Latitude E6410 SSD=120G OS=Mageia7 DE=Xfce, Config n°3 : ThinkpadR40 SSD=32G OS=[Manjaro, Parabola, Mageia6] DE=Xfce, Config n°4 : EeePC901 SSD=20Gb, OS=[SliTaz5/Lxde, Mageia6/Xfce]
   
bal1 Membre non connecté

Rang

Avatar

Inscrit le : 22/01/2013 à 20h26

Localisation : Besançon - France

Messages: 284

Le 29/04/2019 à 21h10
magnux77 :
"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.



:merci:
Alain
Tour LDLC Frakass [CM :ASROCK H81M-HDS Celeron 2800 Ghz RAM 4 Go SSD 120 Go HDD 160 Go]
Mageïa 6 x86-64 bureau Xfce4 + VirtualBox Mageïa 6 x86-64 bureau LXQT
   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie