mercredi 2 janvier 2013

Import dans libreoffice base

Dans ce billet nous allons montrer comment facilement importer les données d'un fichier de type CSV dans une base données HSQL (base de donnée intégrée à libreoffice).
A l'ouverture de libreoffice base, nous choisissons de nous connecter à une base de données existante de type texte.
Tiens, on ne vient pas, là tout de suite, de parler de base de données HSQL?
Oui, mais cela ce sera pour plus tard.
Donc nous choisissons de nous connecter à une base de données existante de type texte:


Nous avons préalablement créé un dossier ~/Documents/bdcsv destiné à contenir les tables de notre base de données (qui sont en réalité des fichiers de type CSV) et nous en indiquons le chemin au moment de paramétrer la connexion vers les fichiers textes. Nous ne manquons pas de paramétrer le point-virgule comme étant le séparateur de champ (s'il en est ainsi pour nos fichiers CSV) et de choisir pour séparateur de décimales celui qui convient:


Nous terminons en enregistrant la base de données sous le nom bdcsv. 
A l'ouverture du fichier bdcsv.odb, nous constatons que la base de données ne contient aucune table.
Normal puisque ~/Documents/bdcsv est vide.
Nous y plaçons le fichier opérations.csv contenant les donnée à importer:

id_op;date_op;montant;contrepartie
2011-0458;2011-12-30;487.33;RN2
2012-0001;2012-01-03;1874.56;RN1
2012-0002;2012-01-03;-42.57;ceci
2012-0003;2012-01-14;-119.23;cela
2012-0004;2012-01-14;-314.00;VOIT
2012-0005;2012-01-31;-114.23;Tél
2012-0006;2012-01-31;-956.00;Loyer
2012-0007;2012-01-31;1874.56;RN1
2012-0008;2012-02-01;-127.23;GS
2012-0009;2012-02-09;-47.00;Autre
2012-0010;2012-02-11;-845.99;TV
2012-0011;2012-02-14;-25.47;Div
2012-0012;2012-02-15;-49.00;Ceci
2012-0013;2012-02-20;-314.00;VOIT
2012-0014;2012-02-27;-103.49;Tél
2012-0015;2012-02-29;-956.00;Loyer
2012-0016;2012-02-29;1874.56;RN2
2012-0017;2012-03-01;-117.23;GS
2012-0018;2012-03-06;-43.00;Autre
2012-0019;2012-03-06;-76.84;Div

Pour voir apparaître l'icône de la table, nous passons par le menu Affichage → Actualiser les tables :


Cliquant droit sur l'icône de la table qui est apparue


nous sélectionnons 'Éditer' dans le menu contextuel qui surgit  afin de vérifier quel type a été attribué aux différents champs de la table:


Nous vérifions que pour le champ 'montant' les décimales ont bien été prises en compte.
Nous constatons que date_op est bien au format 'Date'. Ce ne serait pas le cas si une seule rangée de la table contenait une date invalide : date_op serait alors au format 'Texte' ce qui ne manquerait pas de poser problème pour la suite.
La suite ? Quelle suite ?
Et bien, rappelons le,  le but est d'importer les données du fichier opérations.csv dans une base de données intégrée à libreoffice (HSQL).
bdcsv.odb est en fait une base de de données de transit, un réservoir de données à importer dans la véritable base de données finale. Chaque fois que nous disposerons de données au format CSV à importer, il nous suffira avant de procéder de placer le fichier de données dans ~/Documents/bdcsv.
Attention: si le fichier en question utilise le séparateur de texte, toutes les données concernées seront de type texte. Si ce n'est pas souhaité, il convient alors de supprimer le dit séparateur par exemple en utilisant sed:
sed -r -i.old 's/\"//g' fichier.csv
Lançons maintenant une deuxième instance de libreoffice en choisissant au niveau du menu d’accueil l'option 'Créer une base de données' et nous terminons en enregistrant cette base de données sous le nom 'opérations'. Et voici notre base de données finale sur les rails!
Ensuite, plutôt que d'utiliser le mode 'Ébauche' pour créer la table où placer les données à importer, nous procédons via le menu Outils → SQL:


Dans la fenêtre 'Instruction SQL', nous collons l'instruction:

CREATE TABLE opérations
(reference CHAR(9) PRIMARY KEY,
date_exec DATE,
montant NUMERIC(13,2),
contrepartie CHAR(5))
;

et nous appuyons sur le bouton exécuter:



La table nouvellement créée sera visible après utilisation du menu Affichage -> Actualiser les tables. Nous constatons que la table a été créée sous le nom 'OPÉRATIONS':


Effectuons un 'glisser-déposer' de l'icône bdcsv.odb->opérations dans la zone des Tables de opérations.odb. Dans la fenêtre qui surgit nous remplaçons le nom de la table source (opérations) par celui de la table cible (OPÉRATIONS) et nous cochons 'Ajouter des données' :


L'appui sur le bouton 'Suivant' nous permet de vérifier la correspondance des colonnes.


L'appui sur 'Créer' finalise l'opération d'importation.

Il est plus facile (comme nous l'avons fait) mais pas nécessaire de créer au préalable la table destinée à recevoir les données que nous souhaitons importer.
Si cette table n'existe pas, dans la fenêtre 'Copier la table', nous cochons 'Définition et données' ainsi que 'Créer une clé primaire' à laquelle nous donnons le nom id_op. Mais ceci nous conduit à une impasse:


Aussi nous recommençons après avoir remis le nom par défaut et après avoir décoché 'Créer une clé primaire':


Le bouton 'Suivant' nous donne le choix des colonnes à importer :


Nous pouvons ensuite modifier à notre guise le type des différents champs, par exemple pour id_op passer du type TEXTE[VARCHAR] au type TEXTE (FIXE)[CHAR].
Il ne faut pas oublier de mettre le nombre de décimales à 2 pour le champ 'montant' :


Après avoir appuyé sur 'Créer', nous répondons 'Oui' à la question 'Créer une clef primaire' car sans cela il nous sera impossible par la suite de définir id_op comme clé primaire:


Évidemment ceci ajoute une colonne supplémentaire (ID par défaut) à la table, colonne que nous supprimons illico.
Pour ce faire nous cliquons droit sur l'icône de la table qui vient d'être créée et nous sélectionnons 'Editer' dans le menu contextuel qui surgit. Ensuite dans la fenêtre 'Table design' nous cliquons droit en tête de la ligne définissant ID et nous choisissons 'Supprimer' :


Puis comme il nous faut une clef primaire pour pouvoir éditer les données, nous cliquons droit en tête de la ligne définissant id_op et nous choisissons 'Clef primaire' :


Et voilà!