私はExcelで巨大なテーブルを開発しましたが、現在それをpostgresqlデータベースに転送する際に問題に直面しています。 odbcソフトウェアをダウンロードし、postgresqlで作成したテーブルをExcelで開くことができます。ただし、Excelでテーブルを作成してpostgresqlで開くという逆の方法ではできません。したがって、この方法で行うことができるか、またはpgAdmin IIIを使用して大きなテーブルを作成できる別の方法があるのかを知りたいと思います。
すべての助けてくれてありがとう!
典型的な答えはこれです:
Excelで、ファイル/名前を付けて保存、CSVを選択し、現在のシートを保存します。
postgresユーザーがアクセスできるPgサーバー上の保持ディレクトリに転送する
postgreSQLの場合:
COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
しかし、これを行う方法は他にもあります。 PostgreSQLは驚くほどプログラム可能なデータベースです。これらは次のとおりです。
Pl/javaU、pl/perlU、またはその他の信頼できない言語でモジュールを記述して、ファイルにアクセスし、解析し、構造を管理します。
CSVとfdw_fileを使用して、擬似テーブルとしてアクセスします
DBILinkとDBD :: Excelを使用する
Excelファイルを読み取るための独自の外部データラッパーを作成します。
可能性は文字通り無限です。
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。
また、psqlコンソールを使用して、ファイルをPostgresqlサーバーマシンに送信せずに\ copyを実行することもできます。コマンドは同じです:
\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER
私が使用する方法は、テーブルを [〜#〜] r [〜#〜] にロードすることですdata.frame
として、dbWriteTable
を使用してPostgreSQLにプッシュします。これらの2つの手順を以下に示します。
[〜#〜] 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
オブジェクトを簡単に表示して、期待どおりであることを確認できます。
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);
ここで説明されているように 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;
簡単な使用法:
ogr_fdw_info.exeを使用して、シート名リストのExcelファイルをプローブします。
ogr_fdw_info -s "C:/Excel.xlsx"
「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ファイルへのアクセス権限が必要です。
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つの引数(ナット)しか処理できないことがわかります。それがもっと許せばいいでしょう。
Java Apache POIライブラリ( https://poi.Apache.org/ )を使用してコードを記述することにより、Excelファイルのコンテンツの読み込みを処理できます。 Excelを含むMS Officeアプリケーションデータを操作します。
最近、ExcelファイルをPostgresデータベースにロードするのに役立つテクノロジーに基づいてアプリケーションを作成しました。アプリケーションは http://www.abespalov.com/ で利用できます。アプリケーションはWindowsでのみテストされますが、Linuxでも動作するはずです。
アプリケーションは、Excelファイルと同じ列で必要なテーブルを自動的に作成し、テーブルにコンテンツを取り込みます。複数のファイルを並行してエクスポートできます。ファイルをCSV形式に変換する手順をスキップできます。アプリケーションは、xlsおよびxlsx形式を処理します。
全体的なアプリケーションステージは次のとおりです。
{
fileExtension = FilenameUtils.getExtension(inputSheetFile.getName());
if (fileExtension.equalsIgnoreCase("xlsx")) {
workbook = createWorkbook(openOPCPackage(inputSheetFile));
} else {
workbook =
createWorkbook(openNPOIFSFileSystemPackage(inputSheetFile));
}
sheet = workbook.getSheetAt(0);
}
{
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 )を見つけることができます。