CSVファイルからデータをインポートしてテーブルにデータを設定するストアドプロシージャを作成する方法を教えてください。
これを見てください 短い記事 。
ここで言い換えれば:
テーブルを作成してください:
CREATE TABLE Zip_codes
(Zip char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, Zip_CLASS varchar);
CSVファイルからテーブルにデータをコピーします。
COPY Zip_codes FROM '/path/to/csv/Zip_CODES.txt' WITH (FORMAT csv);
COPY
(これはdbサーバーで機能する)を使用する許可がない場合は、代わりに\copy
(dbクライアントで機能する)を使用できます。 Bozhidar Batsovと同じ例を使用します。
テーブルを作成します。
CREATE TABLE Zip_codes
(Zip char(5), LATITUDE double precision, LONGITUDE double precision,
CITY varchar, STATE char(2), COUNTY varchar, Zip_CLASS varchar);
CSVファイルからテーブルにデータをコピーします。
\copy Zip_codes FROM '/path/to/csv/Zip_CODES.txt' DELIMITER ',' CSV
読み取る列を指定することもできます。
\copy Zip_codes(Zip,CITY,STATE) FROM '/path/to/csv/Zip_CODES.txt' DELIMITER ',' CSV
これを行う簡単な方法の1つは、Pythonのパンダライブラリを使用することです(バージョン0.15以上が最も効果的です)。これはあなたのためにカラムを作成することを扱います - 明らかにそれがデータタイプのためにする選択はあなたが望むものではないかもしれません。それが望んだとおりにはうまくいかない場合は、常にテンプレートとして生成された 'create table'コードを使用できます。
これは簡単な例です:
import pandas as pd
df = pd.read_csv('mypath.csv')
df.columns = [c.lower() for c in df.columns] #postgres doesn't like capitals or spaces
from sqlalchemy import create_engine
engine = create_engine('postgresql://username:password@localhost:5432/dbname')
df.to_sql("my_table_name", engine)
そして、さまざまなオプションを設定する方法を示すいくつかのコードがあります。
# Set it so the raw sql output is logged
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
df.to_sql("my_table_name2",
engine,
if_exists="append", #options are ‘fail’, ‘replace’, ‘append’, default ‘fail’
index=False, #Do not output the index of the dataframe
dtype={'col1': sqlalchemy.types.NUMERIC,
'col2': sqlalchemy.types.String}) #Datatypes should be [sqlalchemy types][1]
インポートを実行するためのGUIを提供するpgAdminを使用することもできます。これは SO thread に示されています。 pgAdminを使用する利点は、リモートデータベースに対しても機能することです。
ただし、以前のソリューションと非常によく似ていますが、テーブルをデータベース上に用意しておく必要があります。各自が独自の解決策を持っていますが、私は通常ExcelでCSVを開き、ヘッダーをコピーし、別のワークシートに特別な転置を貼り付け、対応するデータ型を次の列に配置し、それをコピーしてテキストエディタに貼り付ける以下のような適切なSQLテーブル作成クエリと一緒に。
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
ここでの他のほとんどの解決策はあなたが前もって/手動でテーブルを作成することを必要とします。これは、場合によっては実用的ではない場合があります(たとえば、宛先表に多数の列がある場合)。それで、以下のアプローチは便利になるかもしれません。
Csvファイルのパスと列数を指定して、次の関数を使用してtarget_table
という名前の一時テーブルにテーブルをロードできます。
一番上の行には列名があると見なされます。
create or replace function data.load_csv_file
(
target_table text,
csv_path text,
col_count integer
)
returns void as $$
declare
iter integer; -- dummy integer to iterate columns with
col text; -- variable to keep the column name at each iteration
col_first text; -- first column name, e.g., top left corner on a csv file or spreadsheet
begin
set schema 'your-schema';
create table temp_table ();
-- add just enough number of columns
for iter in 1..col_count
loop
execute format('alter table temp_table add column col_%s text;', iter);
end loop;
-- copy the data from csv file
execute format('copy temp_table from %L with delimiter '','' quote ''"'' csv ', csv_path);
iter := 1;
col_first := (select col_1 from temp_table limit 1);
-- update the column names based on the first row which has the column names
for col in execute format('select unnest(string_to_array(trim(temp_table::text, ''()''), '','')) from temp_table where col_1 = %L', col_first)
loop
execute format('alter table temp_table rename column col_%s to %s', iter, col);
iter := iter + 1;
end loop;
-- delete the columns row
execute format('delete from temp_table where %s = %L', col_first, col_first);
-- change the temp table name to the name given as parameter, if not blank
if length(target_table) > 0 then
execute format('alter table temp_table rename to %I', target_table);
end if;
end;
$$ language plpgsql;
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
PostgreSQLを使った個人的な経験、まだ早い方法を待っています。
1.ファイルがローカルに保存されている場合は、最初にテーブルスケルトンを作成します。
drop table if exists ur_table;
CREATE TABLE ur_table
(
id serial NOT NULL,
log_id numeric,
proc_code numeric,
date timestamp,
qty int,
name varchar,
price money
);
COPY
ur_table(id, log_id, proc_code, date, qty, name, price)
FROM '\path\xxx.csv' DELIMITER ',' CSV HEADER;
2.\path\xxx.csvがサーバー上にある場合、postgreSQLはサーバーにアクセスする権限を持っていません。組み込みのpgAdmin機能を通して.csvファイルをインポートする必要があります。
テーブル名を右クリックして[インポート]を選択します。
それでも問題が解決しない場合は、このチュートリアルを参照してください。 http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
私見、最も便利な方法は、 csvsql from csvkit を使用して、 " CSVデータをpostgresqlにインポートする---) "に従うことです。これは、pipでインストール可能なpythonパッケージです。
このSQLコードを使う
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
headerキーワードは、csvファイルに属性を持つヘッダがあることをDBMSに知らせます。
詳細については http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
最初にテーブルを作成する
次に、copyコマンドを使ってテーブルの詳細をコピーします。
コピー table_name(C1、C2、C3 ...)
から 'csvファイルへのパス' delimiter '、' csvヘッダー。
ありがとう
Text/parse複数行CSVからインポートするための簡単なメカニズムが必要な場合は、次のようにします。
CREATE TABLE t -- OR INSERT INTO tab(col_names)
AS
SELECT
t.f[1] AS col1
,t.f[2]::int AS col2
,t.f[3]::date AS col3
,t.f[4] AS col4
FROM (
SELECT regexp_split_to_array(l, ',') AS f
FROM regexp_split_to_table(
$$a,1,2016-01-01,bbb
c,2,2018-01-01,ddd
e,3,2019-01-01,eee$$, '\n') AS l) t;
テーブルを作成し、csvファイルでテーブルを作成するために使用される必須の列を持っています。
Postgresを開き、読み込みたいターゲットテーブルを右クリックしてインポートを選択し、 ファイルオプション セクションで以下の手順を更新します
今すぐファイル名であなたのファイルを閲覧
フォーマットでcsvを選択
ISO_8859_5としてエンコード
今後藤 その他。 options そしてヘッダーをチェックしてインポートをクリック。
Pythonでは、カラム名を使ったPostgreSQLの自動テーブル作成にこのコードを使うことができます。
import pandas, csv
from io import StringIO
from sqlalchemy import create_engine
def psql_insert_copy(table, conn, keys, data_iter):
dbapi_conn = conn.connection
with dbapi_conn.cursor() as cur:
s_buf = StringIO()
writer = csv.writer(s_buf)
writer.writerows(data_iter)
s_buf.seek(0)
columns = ', '.join('"{}"'.format(k) for k in keys)
if table.schema:
table_name = '{}.{}'.format(table.schema, table.name)
else:
table_name = table.name
sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format(table_name, columns)
cur.copy_expert(sql=sql, file=s_buf)
engine = create_engine('postgresql://user:password@localhost:5432/my_db')
df = pandas.read_csv("my.csv")
df.to_sql('my_table', engine, schema='my_schema', method=psql_insert_copy)
それはまた比較的速いです、私は約4分で330万行以上をインポートすることができます。
私はcsv
ファイルをPostgreSQLに簡単にインポートする小さなツールを作成しました。これは単なるコマンドです。テーブルを作成してデータを投入します。
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
このツールは https://github.com/eduardonunesp/csv2pg にあります。
CSVファイルのデータをPostgreSQLのテーブルにインポートする方法
ステップ:
Postgresqlデータベースを端末に接続する必要があります
psql -U postgres -h localhost
データベースを作成する必要があります
create database mydb;
ユーザーを作成する必要があります
create user siva with password 'mypass';
データベースに接続する
\c mydb;
スキーマを作成する必要があります
create schema trip;
テーブルを作成する必要があります
create table trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount
);
CSVファイルのデータをpostgresqlにインポートする
COPY trip.test(VendorID int,passenger_count int,trip_distance decimal,RatecodeID int,store_and_fwd_flag varchar,PULocationID int,DOLocationID int,payment_type decimal,fare_amount decimal,extra decimal,mta_tax decimal,tip_amount decimal,tolls_amount int,improvement_surcharge decimal,total_amount) FROM '/home/Documents/trip.csv' DELIMITER ',' CSV HEADER;
与えられたテーブルデータを探す
select * from trip.test;