web-dev-qa-db-ja.com

ExcelデータをPostgreSQL 9.3にインポートする

私はExcelで巨大なテーブルを開発しましたが、現在それをpostgresqlデータベースに転送する際に問題に直面しています。 odbcソフトウェアをダウンロードし、postgresqlで作成したテーブルをExcelで開くことができます。ただし、Excelでテーブルを作成してpostgresqlで開くという逆の方法ではできません。したがって、この方法で行うことができるか、またはpgAdmin IIIを使用して大きなテーブルを作成できる別の方法があるのか​​を知りたいと思います。

すべての助けてくれてありがとう!

26
green

典型的な答えはこれです:

  1. Excelで、ファイル/名前を付けて保存、CSVを選択し、現在のシートを保存します。

  2. postgresユーザーがアクセスできるPgサーバー上の保持ディレクトリに転送する

  3. postgreSQLの場合:

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

しかし、これを行う方法は他にもあります。 PostgreSQLは驚くほどプログラム可能なデータベースです。これらは次のとおりです。

  1. Pl/javaU、pl/perlU、またはその他の信頼できない言語でモジュールを記述して、ファイルにアクセスし、解析し、構造を管理します。

  2. CSVとfdw_fileを使用して、擬似テーブルとしてアクセスします

  3. DBILinkとDBD :: Excelを使用する

  4. Excelファイルを読み取るための独自の外部データラッパーを作成します。

可能性は文字通り無限です。

33
Chris Travers

pythonの場合、2010以降のすべてのファイル形式(xlsx)でopenpyxlを使用できます。

Al Sweigartには、 Excelスプレッドシートでの作業 の退屈な部分を自動化する完全なチュートリアルがあります。非常に詳細で、書籍全体とそれに付随するUdemyコースは素晴らしいリソースです。

彼の例から

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

当然のことながら、このアクセス権を取得したら、通常は psycopg を使用してデータをpostgresに解析できます。

これは、 python-Excel のpythonリソースのリストへのリンクです。また、 xlwings は、pythonの代わりにExcelのvba。

5
sayth

また、psqlコンソールを使用して、ファイルをPostgresqlサーバーマシンに送信せずに\ copyを実行することもできます。コマンドは同じです:

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

私が使用する方法は、テーブルを [〜#〜] r [〜#〜] にロードすることですdata.frameとして、dbWriteTableを使用してPostgreSQLにプッシュします。これらの2つの手順を以下に示します。

ExcelデータをRに読み込む

[〜#〜] r [〜#〜]data.frameオブジェクトはデータベースに似ており、名前付き列には次のような明示的な型があります。テキストまたは数字として。 [〜#〜] r [〜#〜]にスプレッドシートを取得するには、 XLConnect 。ただし、非常に簡単な方法は、Excelテーブルの範囲(ヘッダーを含む)を選択してコピーすることです(つまり、 CTRL+C)、[〜#〜] r [〜#〜]でこのコマンドを使用してクリップボードから取得します。

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

RStudioを使用している場合、dオブジェクトを簡単に表示して、期待どおりであることを確認できます。

PostgreSQLにプッシュする

CRANから RPostgreSQL がインストールされていることを確認してから、接続を確立し、data.frameをデータベースに送信します。

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

dbWriteTable(conn, "some_table_name", d)

これで、some_table_nameがデータベースに表示されます。

PgAdminまたは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);
4
Mike T

ここで説明されているように http://www.postgresonline.com/journal/categories/journal/archives/339-OGR-foreign-data-wrapper-on-Windows-first-taste.html

Ogr_fdwモジュールを使用すると、pgsqlでExcelシートを外部テーブルとして開き、pgsqlの他の通常のテーブルと同様に直接クエリできます。これは、定期的に更新される同じテーブルからデータを読み取るのに便利です

これを行うには、スプレッドシートのテーブルヘッダーがクリーンである必要があります。現在のogr_fdwドライバーはワイド文字や改行などをこれらの文字で処理できないため、おそらくpgsqlの列を参照できないためです。エンコードの問題。 (この素晴らしい拡張機能を使用できない主な理由)

Windows用のogr_fdwビルド前バイナリは、ここにあります http://winnie.postgis.net/download/windows/pg96/buildbot/extras/ リンク内のバージョン番号を変更して、対応するビルドをダウンロードします。ファイルをpgsqlフォルダーに抽出して、同じ名前のサブフォルダーを上書きします。 pgsqlを再起動します。テストドライブの前に、次を実行してモジュールをインストールする必要があります。

CREATE EXTENSION ogr_fdw;

簡単な使用法:

  1. ogr_fdw_info.exeを使用して、シート名リストのExcelファイルをプローブします。

    ogr_fdw_info -s "C:/Excel.xlsx"
    
  2. 「ogr_fdw_info.exe -l」を使用して、個々のシートをプロービングし、テーブル定義コードを生成します。

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

生成された定義コードをpgsqlで実行すると、外部テーブルが作成され、Excelファイルにマッピングされます。通常のテーブルのようにクエリできます。

これは、同じテーブル構造の小さなファイルが多数ある場合に特に便利です。定義のパスと名前を変更し、定義を更新するだけで十分です。

このプラグインはXLSXファイルとXLSファイルの両方をサポートしています。ドキュメントによると、スプレッドシートファイルにデータを書き戻すこともできますが、Excelのすべての派手な書式設定は失われ、ファイルは書き込み時に再作成されます。

Excelファイルが大きい場合。これは機能しません。これは、この拡張機能を使用しなかったもう1つの理由です。データを一度にロードします。ただし、この拡張機能はODBCインターフェイスをサポートしています。WindowsのODBC Excelファイルドライバを使用してODBC = Excelファイルのソースであり、ogr_fdwまたは他のpgsqlのODBC外部データラッパーを使用して、この中間ODBCソース。これはかなり安定している必要があります。

欠点は、以前のアプローチのようにpgsql内でファイルの場所や名前を簡単に変更できないことです。

フレンドリーなリマインダー。権限の問題は、このfdw拡張機能に適用されます。 pgsqlサービスにロードされているため。 pgsqlには、Excelファイルへのアクセス権限が必要です。

2
Ben

Excel/PowerPivotを使用してpostgreSQL insertステートメントを作成しました。あなたが何度も何度もそれを行う必要がある場合を除いて、やり過ぎのようです。データがPowerPivotウィンドウに表示されたら、concatenateステートメントを使用して連続した列を追加し、insertステートメントを「構築」します。最後の最後の列を使用して、フラットなピボットテーブルを作成します。結果のinsertステートメントをコピーして、pgAdminを使用して既存のpostgreSQLテーブルに貼り付けます。

例2列のテーブル(私のテーブルには、同じExcel/PowerPivotで連続したコンテンツを何度もインポートする30個の列があります。)

列1 {a、b、...}列2 {1,2、...}

PowerPivotでは、次のコマンドを使用して計算列を追加します。

計算列1には_"insert into table_name values ('"_があります

計算列2にはCONCATENATE([Calculated Column 1],CONCATENATE([Column1],"','"))があります

...最後の列に到達し、挿入ステートメントを終了するまで:

計算列3にはCONCATENATE([Calculated Column 2],CONCATENATE([Column2],"');"があります

次に、PowerPivotで、フラット化されたピボットテーブルを追加し、pgAgentにコピーアンドペーストするすべてのinsertステートメントを追加します。

結果の挿入ステートメント:

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

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

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

注:パワーピボットのCONCATENATEステートメントに精通している場合、2つの引数(ナット)しか処理できないことがわかります。それがもっと許せばいいでしょう。

0
d.a.yantis

Java Apache POIライブラリ( https://poi.Apache.org/ )を使用してコードを記述することにより、Excelファイルのコンテンツの読み込みを処理できます。 Excelを含むMS Officeアプリケーションデータを操作します。

最近、ExcelファイルをPostgresデータベースにロードするのに役立つテクノロジーに基づいてアプリケーションを作成しました。アプリケーションは http://www.abespalov.com/ で利用できます。アプリケーションはWindowsでのみテストされますが、Linuxでも動作するはずです。

アプリケーションは、Excelファイルと同じ列で必要なテーブルを自動的に作成し、テーブルにコンテンツを取り込みます。複数のファイルを並行してエクスポートできます。ファイルをCSV形式に変換する手順をスキップできます。アプリケーションは、xlsおよびxlsx形式を処理します。

全体的なアプリケーションステージは次のとおりです。

  1. Excelファイルのコンテンツをロードします。ファイル拡張子に依存するコードは次のとおりです。

{

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

sheet = workbook.getSheetAt(0);

}

  1. Postgres JDBC接続を確立する
  2. Postgresテーブルを作成する
  3. シートを反復処理し、行をテーブルに挿入します。以下は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
}  

}

ここで、ExcelをPostgresにエクスポートするために作成されたアプリケーションのすべてのJavaコード( https://github.com/palych-piter/Excel2DB )を見つけることができます。

0
Andrey