web-dev-qa-db-fra.com

Importer des données Excel dans PostgreSQL 9.3

J'ai développé un énorme tableau dans Excel et je suis maintenant confronté à un problème de transfert dans la base de données postgresql. J'ai téléchargé le logiciel odbc et je suis capable d'ouvrir un tableau créé dans postgresql avec Excel. Cependant, je ne suis pas capable de le faire de manière inverse, ce qui crée un tableau dans Excel et l'ouvre dans le postgresql. J'aimerais donc savoir que cela peut être fait de cette manière ou existe-t-il d'autres moyens de créer un grand tableau avec pgAdmin III, car l'insertion des données brutes par brut est assez fastidieuse.

Merci d'avance pour toutes les aides!

22
green

la réponse typique est la suivante:

  1. Dans Excel, Fichier/Enregistrer sous, sélectionnez CSV, enregistrez votre feuille actuelle.

  2. transférer dans un répertoire de stockage sur le serveur Pg auquel l'utilisateur postgres peut accéder

  3. dans PostgreSQL:

    COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
    

Mais il y a d'autres moyens de le faire aussi. PostgreSQL est une base de données incroyablement programmable. Ceux-ci inclus:

  1. Ecrivez un module en pl/javaU, pl/perlU ou dans un autre langage non fiable pour accéder au fichier, analysez-le et gérez la structure.

  2. Utilisez CSV et le fdw_file pour y accéder en tant que pseudo-table

  3. Utiliser DBILink et DBD :: Excel

  4. Écrivez votre propre wrapper de données étrangères pour lire les fichiers Excel.

Les possibilités sont littéralement infinies....

31
Chris Travers

Vous pouvez également utiliser la console psql pour exécuter\copy sans avoir à envoyer de fichier à la machine serveur Postgresql. La commande est la même:

\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER
5
alexkovelsky

Pour python, vous pouvez utiliser openpyxl pour tous les formats de fichier 2010 et plus récents (xlsx).

Al Sweigart propose un didacticiel complet permettant d’automatiser les parties ennuyeuses sur avec les feuilles de calcul Excel sa très grande profondeur et le livre entier ainsi que le cours Udemy qui les accompagne sont d'excellentes ressources.

De son exemple

>>> import openpyxl
>>> wb = openpyxl.load_workbook('example.xlsx')
>>> wb.get_sheet_names()
['Sheet1', 'Sheet2', 'Sheet3']
>>> sheet = wb.get_sheet_by_name('Sheet3')
>>> sheet
<Worksheet "Sheet3">

Naturellement, une fois que vous avez cet accès, vous pouvez maintenant utiliser psycopg pour analyser les données dans postgres comme vous le feriez normalement.

Ceci est un lien vers une liste de ressources python sur python-Excel aussi xlwings fournit un large éventail de fonctionnalités permettant d’utiliser python à la place de vba dans Excel.

3
sayth

Comme expliqué ici http://www.postgresonline.com/journal/categories/journal/archives/339-OGR-foreign-data-wrapper-on-Windows-first-taste.html

Avec le module ogr_fdw, il est possible d’ouvrir la feuille Excel en tant que table étrangère dans pgsql et l’interroger directement comme toute autre table ordinaire dans pgsql . Ceci est utile pour lire des données à partir du même tableau mis à jour régulièrement

Pour ce faire, l'en-tête du tableau dans votre feuille de calcul doit être propre, le pilote ogr_fdw actuel ne peut pas traiter les caractères de largeur, les nouvelles lignes, etc. Avec ces caractères, vous ne pourrez probablement pas référencer la colonne dans pgsql pour des raisons: problème d'encodage. (Principale raison pour laquelle je ne peux pas utiliser cette merveilleuse extension.)

Les fichiers binaires ogr_fdw de pré-génération pour Windows se trouvent ici http://winnie.postgis.net/download/windows/pg96/buildbot/extras/ Changez le numéro de version dans le lien pour télécharger les versions correspondantes extraire le fichier dans le dossier pgsql pour écraser le même nom de sous-dossiers . restart pgsql. Avant le test, le module doit être installé en exécutant:

CREATE EXTENSION ogr_fdw;

Utilisation en bref:

  1. utilisez ogr_fdw_info.exe pour tester le fichier Excel pour la liste des noms de feuilles

    ogr_fdw_info -s "C:/Excel.xlsx"
    
  2. utilisez "ogr_fdw_info.exe -l" pour tester une feuille individuelle et générer un code de définition de table.

    ogr_fdw_info -s "C:/Excel.xlsx" -l "sheetname"
    

Exécutez le code de définition généré dans pgsql, une table étrangère est créée et mappée sur votre fichier Excel. il peut être interrogé comme des tables ordinaires. 

Ceci est particulièrement utile si vous avez beaucoup de petits fichiers avec la même structure de table. Il suffit de changer le chemin et le nom de la définition, et mettre à jour la définition suffira.

Ce plugin prend en charge les fichiers XLSX et XLS . Selon le document, il est également possible d'écrire des données dans le fichier de feuille de calcul, mais toute la mise en forme sophistiquée de votre Excel sera perdue, le fichier est recréé en écriture.

Si le fichier Excel est énorme. Cela ne fonctionnera pas. ce qui est une autre raison pour laquelle je n'ai pas utilisé cette extension. Il charge les données en une fois. Mais cette extension supportant également l’interface ODBC, il devrait être possible d’utiliser le pilote de fichier Excel ODBC de Windows pour créer une source ODBC pour le fichier Excel et d’utiliser ogr_fdw ou toute autre méthode. Le wrapper de données étrangères ODBC de pgsql pour interroger cette source ODBC intermédiaire. Cela devrait être assez stable. 

L'inconvénient est que vous ne pouvez pas changer facilement l'emplacement ou le nom du fichier dans pgsql, comme dans l'approche précédente.

Un rappel amical. Le problème d'autorisation s'applique à cette extension fdw. depuis son chargement dans le service pgsql. pgsql doit avoir un accès privilégié aux fichiers Excel.

2
Ben

J'ai utilisé Excel/PowerPivot pour créer l'instruction postgreSQL insert. Cela semble excessif, sauf lorsque vous devez le faire encore et encore. Une fois que les données sont dans la fenêtre PowerPivot, j'ajoute des colonnes successives avec des instructions concatenate pour "générer" l'instruction insert. Je crée un tableau croisé dynamique avec cette dernière et dernière colonne. Copiez et collez l’instruction insert obtenue dans ma table EXISTING postgreSQL avec pgAdmin.

Exemple de table à deux colonnes (ma table comporte 30 colonnes à partir desquelles j'importe des contenus successifs avec le même fichier Excel/PowerPivot.)

Column1 {a, b, ...} Column2 {1,2, ...}

Dans PowerPivot, j'ajoute des colonnes calculées à l'aide des commandes suivantes:

La colonne calculée 1 a "insert into table_name values ('"

La colonne 2 calculée a CONCATENATE([Calculated Column 1],CONCATENATE([Column1],"','"))

... jusqu'à ce que vous arriviez à la dernière colonne et que vous deviez mettre fin à l'instruction insert:

La colonne 3 calculée a CONCATENATE([Calculated Column 2],CONCATENATE([Column2],"');"

Ensuite, dans PowerPivot, j'ajoute un tableau croisé dynamique et dispose de toutes les instructions insert que je viens de copier-coller dans pgAgent.

Instructions d'insertion résultantes:

insert into table_name values ('a','1');

insert into table_name values ('b','2');

insert into table_name values ('c','3');

REMARQUE: Si vous connaissez bien l'instruction CONCENTENATE de power pivot, vous saurez qu'elle ne peut gérer que 2 arguments (écrous). Serait bien si cela permettait plus.

0
d.a.yantis

Vous pouvez gérer le chargement du contenu du fichier Excel en écrivant du code Java à l'aide de la bibliothèque de POI Apache ( https://poi.Apache.org/ ). La bibliothèque est développée pour travailler avec les données d'application MS Office, y compris Excel. 

J'ai récemment créé l'application basée sur la technologie qui vous aidera à charger des fichiers Excel dans la base de données Postgres. L'application est disponible sous http://www.abespalov.com/ . L'application est testée uniquement pour Windows, mais devrait également fonctionner pour Linux. 

L'application crée automatiquement les tables nécessaires avec les mêmes colonnes que dans les fichiers Excel et remplit les tables avec du contenu. Vous pouvez exporter plusieurs fichiers en parallèle. Vous pouvez ignorer l'étape de conversion des fichiers au format CSV. L'application gère les formats xls et xlsx.

Les étapes d'application globales sont: 

  1. Chargez le contenu du fichier Excel. Voici le code en fonction de l'extension du fichier: 

{

fileExtension = FilenameUtils.getExtension(inputSheetFile.getName());
    if (fileExtension.equalsIgnoreCase("xlsx")) {
        workbook = createWorkbook(openOPCPackage(inputSheetFile));
    } else {
        workbook =     
        createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile));
    }

sheet = workbook.getSheetAt(0);

}

  1. Établir une connexion JDBC Postgres 
  2. Créer une table Postgres
  3. Itérez sur la feuille et insérez des lignes dans la table. Voici un morceau de code Java: 

{

Iterator<Row> rowIterator = InitInputFilesImpl.sheet.rowIterator();

//skip a header
if (rowIterator.hasNext()) {
    rowIterator.next();
}
while (rowIterator.hasNext()) {
    Row row = (Row) rowIterator.next();
    // inserting rows
}  

Vous trouverez ici tout le code Java de l'application créée pour exporter Excel vers Postgres ( https://github.com/palych-piter/Excel2DB ).

0
Andrey