Importer des données Excel dans PostgreSQL 9.3
j'ai développé une table énorme dans excel et maintenant faire face à des problèmes en le transférant dans la base de données postgresql. J'ai téléchargé le logiciel odbc et je suis capable d'ouvrir la table créée dans postgresql avec excel. Cependant, je ne suis pas en mesure de le faire d'une manière inverse qui est de créer une table dans excel et l'ouvrir dans le postgresql. Je voudrais donc savoir si cela peut être fait de cette manière ou s'il existe d'autres moyens de créer une grande table avec pgAdmin III cause insérant les données brutes par raw est assez fastidieux.
Merci d'avance pour toute aide!
7 réponses
la réponse typique est ceci:
Dans Excel, Fichier/Enregistrer sous, sélectionnez le format CSV, enregistrez votre feuille en cours.
transfert dans un répertoire d'attente sur le serveur Pg auquel l'utilisateur postgres peut accéder
in PostgreSQL:
COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
Mais il y a d'autres façons de le faire aussi. PostgreSQL est une base de données étonnamment programmable. Elles comprennent:
Ecrire un module dans pl/javaU, pl / perlU, ou tout autre langage non fiable pour accéder au fichier, le analyser et gérer la structure.
Utilisez CSV et le fichier fdw_file pour y accéder sous forme de pseudo-table
utiliser DBILINK et DBD:: Excel
Ecrivez votre propre wrapper de données étrangères pour lire des fichiers Excel.
Les possibilités sont littéralement illimitées....
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
pour python vous pouvez utiliser openpyxl pour tous les formats de fichiers 2010 et plus récents (xlsx).
Al Sweigart a un tutoriel complet de automate the boring parts sur travailler avec des feuilles de calcul excel son très approfondi et le livre entier et le cours D'Udemy qui l'accompagne sont de grandes ressources.
à Partir 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 à postgres comme vous normalement le ferait.
Ceci est un lien vers une liste de python ressources à Python-excel xlwings fournit un large éventail de fonctionnalités pour l'utilisation de python à la place de vba dans excel.
une méthode que j'utilise est de charger la table dans Rdata.frame
, puis utilisez dbWriteTable
pour le pousser à PostgreSQL. Ces deux étapes sont indiquées ci-dessous.
charger les données Excel dans R
Rdata.frame
les objets ressemblent à des bases de données, où les colonnes nommées ont des types explicites, comme du texte ou des nombres. Il y a plusieurs façons de faire entrer un tableur dans R, comme XLConnect. Cependant, un vraiment la méthode simple est de sélectionner l'intervalle de la table Excel (y compris l'en-tête), le copier (i.e. CTRL+ C), puis en R utilisez cette commande pour obtenir à partir du presse-papiers:
d <- read.table("clipboard", header=TRUE, sep="\t", quote="\"", na.strings="", as.is=TRUE)
si vous avez RStudio, vous pouvez facilement voir le d
objet assurez-vous qu'il est comme prévu.
le Pousser à PostgreSQL
assurez-vous que vous avez RPostgreSQL installé à partir de CRAN, puis faire une connexion et envoyer le data.frame
pour la base de données:
library(RPostgreSQL)
conn <- dbConnect(PostgreSQL(), dbname="mydb")
dbWriteTable(conn, "some_table_name", d)
some_table_name
doit apparaître dans la base de données.
certaines étapes courantes de nettoyage peuvent être effectuées à partir de pgAdmin ou psql:
ALTER TABLE some_table_name RENAME "row.names" TO id;
ALTER TABLE some_table_name ALTER COLUMN id TYPE integer USING id::integer;
ALTER TABLE some_table_name ADD PRIMARY KEY (id);
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 comme table étrangère dans pgsql et de l'interroger directement comme n'importe quelle autre table régulière dans pgsql. Ceci est utile pour lecture des données à partir de la même régulièrement mis à jour de la table
pour ce faire, l'en-tête de tableau dans votre tableur doit être propre, le pilote ogr_fdw actuel ne peut pas gérer les caractères larges, les nouvelles lignes, etc. avec ces caractères, vous ne serez probablement pas en mesure de faire référence à la colonne dans pgsql en raison d'un problème d'encodage. (Principale raison pour laquelle je ne peux pas utiliser cette merveilleuse extension.)
les binaires pré-construction ogr_fdw pour windows sont situés ici http://winnie.postgis.net/download/windows/pg96/buildbot/extras/ changez le numéro de version dans le lien pour télécharger les compilations correspondantes. extraire le fichier vers pgsql dossier pour écraser les sous-dossiers du même nom. redémarrez pgsql. Avant le test, le module doit être installé en exécutant:
CREATE EXTENSION ogr_fdw;
Utilisation en bref:
utilisez ogr_fdw_info.exe de prob le fichier excel pour le nom de la feuille de liste
ogr_fdw_info -s "C:/excel.xlsx"
utilisation de "ogr_fdw_info.exe -l" de prob d'une fiche individuelle et de générer une définition de la table de code.
ogr_fdw_info -s "C:/excel.xlsx" -l "sheetname"
exécuter le code de définition généré dans pgsql, une table étrangère est créée et associée à votre fichier excel. il peut être interrogé comme des tables régulières.
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 dans la définition, et mettre à jour la définition sera suffisant.
ce plugin supporte les fichiers XLSX et XLS. Selon le document, il est également possible d'écrire des données dans le fichier tableur, mais tout le formatage de fantaisie dans votre excel sera perdu, le fichier est recréé à écrire.
Si le fichier excel est énorme. Cela ne fonctionnera pas. c'est une autre raison pour laquelle je n'ai pas utilisé cette extension. Il charge les données en une seule fois. Mais cette extension prend également en charge 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 tout autre paquet de données étrangères ODBC de pgsql pour interroger cette source ODBC intermédiaire. Cela devrait être assez stable.
L'inconvénient c'est que vous ne pouvez pas changer l'emplacement ou le nom de fichier facilement dans pgsql comme dans l'approche précédente.
Un rappel amical. La question de la permission s'applique à ces extensions fdw. depuis son chargement dans le service pgsql. pgsql doit avoir un accès privilégié aux fichiers excel.
J'ai utilisé Excel/PowerPivot pour créer le postgreSQL insert
déclaration. C'est un peu exagéré, sauf quand tu dois le refaire encore et encore. Une fois que les données sont dans la fenêtre PowerPivot, j'ajoute des colonnes successives avec concatenate
instructions pour 'construire' le insert
déclaration. Je crée une table à pivot aplati avec cette dernière et dernière colonne. Copiez et collez le résultant insert
déclaration dans ma table postgreSQL existante avec pgAdmin.
exemple deux tableaux de colonnes (mon table dispose de 30 colonnes à partir desquelles je importe des contenus successifs encore et encore avec le même Excel/PowerPivot.)
Colonne1 {a,b,...} Colonne2 {1,2,...}
Dans PowerPivot-je ajouter des colonnes calculées avec les commandes suivantes:
calculé la colonne 1 contient "insert into table_name values ('"
calculé la colonne 2 A CONCATENATE([Calculated Column 1],CONCATENATE([Column1],"','"))
...jusqu'à ce que vous arriviez à la dernière colonne et que vous devez terminer la déclaration insert:
calculé à la colonne 3 a CONCATENATE([Calculated Column 2],CONCATENATE([Column2],"');"
puis dans PowerPivot j'ajoute une table à pivot aplati et j'ai toute l'instruction insert que je viens de copier et coller à pgAgent.
résultats insert statements:
insert into table_name values ('a','1');
insert into table_name values ('b','2');
insert into table_name values ('c','3');
NOTE: Si vous êtes familier avec la déclaration power pivot CONCATENATE, vous savez qu'elle ne peut traiter que 2 arguments (nuts). Ce serait bien si ça permettait plus.
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 fonctionner Pour Linux aussi.
l'application crée automatiquement les tableaux nécessaires avec les mêmes colonnes que dans les fichiers Excel et remplir les tableaux avec le contenu. Vous pouvez exporter plusieurs fichiers en parallèle. Vous pouvez sauter l'étape pour convertir les fichiers dans le format CSV. L'application gère les formats xls et xlsx.
- charger le contenu du fichier excel. Voici le code selon le fichier extension:
fileExtension = FilenameUtils.getExtension(inputSheetFile.getName());
if (fileExtension.equalsIgnoreCase("xlsx")) {
workbook = createWorkbook(openOPCPackage(inputSheetFile));
} else {
workbook =
createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile));
}
sheet = workbook.getSheetAt(0);
}
- établir la connexion Postgresjdbc
- Créer une Postgres table
- itérez la feuille et insérez les lignes dans le tableau. 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
}
}
ici vous pouvez trouver tout le code Java pour l'application créée pour exporter excel vers Postgres (https://github.com/palych-piter/Excel2DB).