it-swarm.com.de

Importieren Sie Excel-Daten in PostgreSQL 9.3

Ich habe in Excel eine große Tabelle entwickelt, die jetzt Probleme bei der Übertragung in die Postgresql-Datenbank hat. Ich habe die odbc-Software heruntergeladen und kann eine in postgresql erstellte Tabelle mit Excel öffnen. Ich bin jedoch nicht in der Lage, dies in umgekehrter Weise zu tun, indem eine Tabelle in Excel erstellt und in der Postgresql-Datei geöffnet wird. Ich würde gerne wissen, dass dies auf diese Weise möglich ist, oder gibt es alternative Möglichkeiten, eine große Tabelle mit pgAdmin III zu erstellen, da das Einfügen der rohen Daten durch Raw ziemlich langwierig ist.

Vielen Dank im Voraus für all die Hilfe!

22
green

die typische Antwort lautet:

  1. Wählen Sie in Excel unter Datei/Speichern unter die Option CSV aus, und speichern Sie das aktuelle Blatt.

  2. Übertragen in ein Verzeichnis auf dem Pg-Server, auf das der Postgres-Benutzer zugreifen kann

  3. in PostgreSQL:

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

Es gibt aber auch andere Möglichkeiten, dies zu tun. PostgreSQL ist eine erstaunlich programmierbare Datenbank. Diese schließen ein:

  1. Schreiben Sie ein Modul in pl/javaU, pl/perlU oder einer anderen nicht vertrauenswürdigen Sprache, um auf die Datei zuzugreifen, sie zu analysieren und die Struktur zu verwalten.

  2. Verwenden Sie CSV und die Datei fdw_file, um als Pseudotabelle darauf zuzugreifen

  3. Verwenden Sie DBILink und DBD :: Excel

  4. Schreiben Sie Ihren eigenen Fremddaten-Wrapper zum Lesen von Excel-Dateien.

Die Möglichkeiten sind buchstäblich endlos ....

31
Chris Travers

Sie können auch die psql-Konsole verwenden, um\copy auszuführen, ohne die Datei an den Postgresql-Server-Computer senden zu müssen. Der Befehl ist derselbe:

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

Eine Methode, die ich benutze, ist das Laden der Tabelle in [~ # ~] r [~ # ~] als data.frame, dann verwenden Sie dbWriteTable, um es an PostgreSQL zu senden. Diese beiden Schritte werden unten gezeigt.

Laden Sie Excel-Daten in R

[~ # ~] r [~ # ~] 's data.frame -Objekte sind datenbankähnlich, wobei benannte Spalten explizite Typen haben, z. B. Text oder Zahlen. Es gibt verschiedene Möglichkeiten, eine Tabelle in [~ # ~] r [~ # ~] zu laden, z. B. XLConnect . Eine wirklich einfache Methode ist es jedoch, den Bereich der Excel-Tabelle (einschließlich der Kopfzeile) auszuwählen und zu kopieren (d. H. CTRL+C), dann verwenden Sie in [~ # ~] r [~ # ~] diesen Befehl, um ihn aus der Zwischenablage abzurufen:

d <- read.table("clipboard", header=TRUE, sep="\t", quote="\"", na.strings="", as.is=TRUE)

Wenn Sie über RStudio verfügen, können Sie das Objekt d problemlos anzeigen, um sicherzustellen, dass es den Erwartungen entspricht.

Schieben Sie es zu PostgreSQL

Stellen Sie sicher, dass RPostgreSQL von CRAN installiert ist, stellen Sie eine Verbindung her und senden Sie das data.frame in die Datenbank:

library(RPostgreSQL)
conn <- dbConnect(PostgreSQL(), dbname="mydb")

dbWriteTable(conn, "some_table_name", d)

Jetzt some_table_name sollte in der Datenbank erscheinen.

Einige übliche Bereinigungsschritte können mit pgAdmin oder psql ausgeführt werden:

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);
4
Mike T

Für Python können Sie openpyxl für alle 2010 und neueren Dateiformate (xlsx) verwenden.

Al Sweigart hat ein komplettes Tutorial zum Automatisieren der langweiligen Teile zu Arbeiten mit Excel-Tabellen . Es ist sehr gründlich und das gesamte Buch und der begleitende Udemy-Kurs sind hervorragende Ressourcen.

Von seinem Beispiel

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

Nach diesem Zugriff können Sie jetzt verständlicherweise mit psycopg die Daten wie üblich in Postgres parsen.

Dies ist ein Link zu einer Liste von Python-Ressourcen unter python-Excel . Xlwings bietet eine Vielzahl von Funktionen zur Verwendung von Python anstelle von vba in Excel.

3
sayth

Wie hier erklärt http://www.postgresonline.com/journal/categories/journal/archives/339-OGR-foreign-data-wrapper-on-Windows-first-taste.html

Mit dem Modul ogr_fdw ist es möglich, das Excel-Arbeitsblatt als Fremdtabelle in pgsql zu öffnen und direkt wie alle anderen regulären Tabellen in pgsql ..__ abzufragen. Dies ist hilfreich, wenn Daten aus derselben regelmäßig aktualisierten Tabelle gelesen werden.

Dazu muss der Tabellenheader in Ihrer Tabelle sauber sein. Der aktuelle ogr_fdw-Treiber kann keine Zeichen mit breiten Zeichen oder neue Zeilen usw. mit diesen Zeichen behandeln. Sie können die Spalte in pgsql wahrscheinlich nicht referenzieren Kodierungsproblem. (Hauptgrund, warum ich diese wunderbare Erweiterung nicht verwenden kann.)

Die ogr_fdw-Vorinstallations-Binärdateien für Windows befinden sich hier http://winnie.postgis.net/download/windows/pg96/buildbot/extras/ Ändern Sie die Versionsnummer im Link, um die entsprechenden Builds herunterzuladen entpacken Sie die Datei in den Ordner pgsql, um dieselben Unterordner mit demselben Namen zu überschreiben . Starten Sie pgsql neu. Vor der Testfahrt muss das Modul installiert werden, indem Folgendes ausgeführt wird:

CREATE EXTENSION ogr_fdw;

Verwendung in Kürze:

  1. verwenden Sie ogr_fdw_info.exe, um die Excel-Datei auf die Liste der Blattnamen zu prüfen

    ogr_fdw_info -s "C:/Excel.xlsx"
    
  2. verwenden Sie "ogr_fdw_info.exe -l", um ein einzelnes Blatt zu prüfen und einen Tabellendefinitionscode zu generieren.

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

Führen Sie den generierten Definitionscode in pgsql aus, eine fremde Tabelle wird erstellt und Ihrer Excel-Datei zugeordnet. es kann wie normale Tabellen abgefragt werden. 

Dies ist besonders nützlich, wenn Sie viele kleine Dateien mit derselben Tabellenstruktur haben. Ändern Sie einfach den Pfad und den Namen in der Definition und aktualisieren Sie die Definition.

Dieses Plugin unterstützt sowohl XLSX- als auch XLS-Dateien. Je nach Dokument ist es auch möglich, Daten in die Tabellendatei zurückzuschreiben, aber alle fancy Formatierungen in Ihrem Excel gehen verloren, die Datei wird beim Schreiben neu erstellt.

Wenn die Excel-Datei riesig ist. Das wird nicht funktionieren. Das ist ein weiterer Grund, warum ich diese Erweiterung nicht verwendet habe. Es lädt Daten auf einmal. Aber diese Erweiterung unterstützt auch die Schnittstelle ODBC. Es sollte möglich sein, den Excel-Dateitreiber ODBC von Windows zu verwenden, um eine ODBC - Quelle für die Excel-Datei zu erstellen und ogr_fdw oder eine andere zu verwenden fremder Daten-Wrapper von pgsql ODBC zum Abfragen dieser Zwischenquelle ODBC. Dies sollte ziemlich stabil sein. 

Der Nachteil ist, dass Sie den Dateispeicherort oder -namen nicht wie in der vorherigen Vorgehensweise in pgsql ändern können.

Eine freundliche Erinnerung. Das Berechtigungsproblem betrifft diese fdw-Erweiterungen. da es in pgsql Dienst geladen ist. pgsql muss Zugriff auf die Excel-Dateien haben.

2
Ben

Ich habe Excel/PowerPivot verwendet, um die postgreSQL-Anweisung insert zu erstellen. Scheint wie ein Overkill, außer wenn Sie es immer wieder tun müssen. Sobald sich die Daten im PowerPivot-Fenster befinden, füge ich nacheinander Spalten mit concatenate-Anweisungen hinzu, um die insert-Anweisung zu "bauen". Ich erstelle eine abgeflachte Pivot-Tabelle mit dieser letzten und letzten Spalte. Kopieren Sie die resultierende insert-Anweisung und fügen Sie sie mit pgAdmin in meine EXISTING postgreSQL-Tabelle ein.

Beispiel für zwei Spaltentabellen (meine Tabelle hat 30 Spalten, aus denen ich aufeinanderfolgende Inhalte immer wieder mit demselben Excel/PowerPivot importiere.)

Spalte1 {a, b, ...} Spalte2 {1,2, ...}

In PowerPivot füge ich berechnete Spalten mit den folgenden Befehlen hinzu:

Berechnete Spalte 1 enthält "insert into table_name values ('"

Berechnete Spalte 2 hat CONCATENATE([Calculated Column 1],CONCATENATE([Column1],"','"))

... bis Sie zur letzten Spalte gelangen und die insert-Anweisung abbrechen müssen:

Berechnete Spalte 3 hat CONCATENATE([Calculated Column 2],CONCATENATE([Column2],"');"

Dann füge ich in PowerPivot eine abgeflachte Pivot-Tabelle hinzu und habe die gesamte Insert-Anweisung, die ich gerade in pgAgent kopiert und eingefügt habe.

Resultierende Einfügeanweisungen:

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

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

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

HINWEIS: Wenn Sie mit der CONCATENATE-Anweisung des Power Pivot vertraut sind, wissen Sie, dass nur 2 Argumente (Muttern) verarbeitet werden können. Wäre schön wenn es mehr erlaube.

0
d.a.yantis

Sie können den Inhalt der Excel-Datei laden, indem Sie Java-Code mit der Apache-POI-Bibliothek schreiben ( https://poi.Apache.org/ ). Die Bibliothek wurde für die Arbeit mit MS-Office-Anwendungsdaten einschließlich Excel entwickelt. 

Ich habe kürzlich eine Anwendung erstellt, die auf der Technologie basiert, mit der Sie Excel-Dateien in die Postgres-Datenbank laden können. Die Anwendung ist unter http://www.abespalov.com/ verfügbar. Die Anwendung wurde nur für Windows getestet, sollte jedoch auch für Linux funktionieren. 

Die Anwendung erstellt automatisch notwendige Tabellen mit denselben Spalten wie in den Excel-Dateien und füllt die Tabellen mit Inhalt. Sie können mehrere Dateien parallel exportieren. Sie können den Schritt zum Konvertieren der Dateien in das CSV-Format überspringen. Die Anwendung verarbeitet die Formate xls und xlsx.

Allgemeine Anwendungsphasen sind: 

  1. Laden Sie den Inhalt der Excel-Datei. Hier ist der Code abhängig von der Dateierweiterung: 

{

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

sheet = workbook.getSheetAt(0);

}

  1. Stellen Sie eine Postgres-JDBC-Verbindung her 
  2. Erstellen Sie eine Postgres-Tabelle
  3. Iterieren Sie über das Blatt und fügen Sie die Zeilen in die Tabelle ein. Hier ist ein Stück Java-Code: 

{

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

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

Hier finden Sie den gesamten Java-Code für die Anwendung, die für den Export von Excel nach Postgres erstellt wurde ( https://github.com/palych-piter/Excel2DB ).

0
Andrey