ฉันจะเขียนขั้นตอนการจัดเก็บที่นำเข้าข้อมูลจากไฟล์ CSV และเติมข้อมูลในตารางได้อย่างไร
ฉันจะเขียนขั้นตอนการจัดเก็บที่นำเข้าข้อมูลจากไฟล์ 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 zip_codes FROM '/path/to/csv/ZIP_CODES.txt' DELIMITER ',' CSV HEADER;
postgresql.org/docs/9.1/static/sql-copy.html
หากคุณไม่ได้รับอนุญาตให้ใช้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
ดูเอกสารประกอบสำหรับการคัดลอก :
อย่าสับสน COPY กับคำสั่ง psql \ copy \ copy เรียกใช้คัดลอกจาก STDIN หรือคัดลอกไปยัง STDOUT แล้วดึง / เก็บข้อมูลในไฟล์ที่เข้าถึงได้โดยไคลเอนต์ psql ดังนั้นความสามารถในการเข้าถึงไฟล์และสิทธิ์การเข้าถึงจึงขึ้นอยู่กับไคลเอ็นต์มากกว่าเซิร์ฟเวอร์เมื่อใช้ \ copy
และหมายเหตุ:
สำหรับคอลัมน์ข้อมูลประจำตัวคำสั่ง COPY FROM จะเขียนค่าคอลัมน์ที่ระบุในข้อมูลอินพุตเช่นตัวเลือก INSERT OVERRIDING SYSTEM VALUE
COPY
และ\copy
เกินกว่าสิทธิ์เท่านั้นและคุณไม่สามารถเพิ่ม `` เพื่อทำให้มันใช้งานได้อย่างน่าอัศจรรย์ ดูคำอธิบาย (ในบริบทของการส่งออก) ที่นี่: stackoverflow.com/a/1517692/157957
วิธีการหนึ่งในการทำเช่นนี้คือไลบรารี Python pandas (เวอร์ชั่น 0.15 ขึ้นไปทำงานได้ดีที่สุด) สิ่งนี้จะจัดการกับการสร้างคอลัมน์สำหรับคุณ - แม้ว่าจะเห็นได้ชัดว่าตัวเลือกสำหรับประเภทข้อมูลอาจไม่ใช่สิ่งที่คุณต้องการ ถ้ามันไม่ได้ทำสิ่งที่คุณต้องการคุณสามารถใช้รหัส 'สร้างตาราง' ที่สร้างขึ้นเป็นเทมเพลต
นี่คือตัวอย่างง่ายๆ:
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]
if_exists
พารามิเตอร์สามารถตั้งค่าให้แทนที่หรือผนวกเข้ากับตารางที่มีอยู่เช่นdf.to_sql("fhrs", engine, if_exists='replace')
คุณยังสามารถใช้ pgAdmin ซึ่งมี GUI เพื่อดำเนินการนำเข้า ที่แสดงในเธรด SOนี้ ข้อดีของการใช้ pgAdmin ก็คือมันสามารถใช้ได้กับฐานข้อมูลระยะไกล
เหมือนโซลูชันก่อนหน้านี้ แต่คุณจะต้องมีตารางของคุณในฐานข้อมูลแล้ว แต่ละคนมีวิธีการแก้ปัญหาของตัวเอง แต่สิ่งที่ฉันมักจะทำคือเปิด CSV ใน Excel คัดลอกส่วนหัววางแบบพิเศษด้วยการโยกย้ายบนแผ่นงานที่แตกต่างกันวางประเภทข้อมูลที่สอดคล้องกันในคอลัมน์ถัดไปจากนั้นเพียงคัดลอกและวางลงในโปรแกรมแก้ไขข้อความ ร่วมกับแบบสอบถามสร้างตาราง SQL ที่เหมาะสมเช่น:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
โซลูชันอื่น ๆ ส่วนใหญ่ที่นี่ต้องการให้คุณสร้างตารางล่วงหน้า / ด้วยตนเอง สิ่งนี้อาจไม่สามารถใช้ได้ในบางกรณี (เช่นหากคุณมีคอลัมน์จำนวนมากในตารางปลายทาง) ดังนั้นวิธีการด้านล่างอาจมีประโยชน์
การระบุจำนวนพา ธ และคอลัมน์ของไฟล์ csv ของคุณคุณสามารถใช้ฟังก์ชันต่อไปนี้เพื่อโหลดตารางของคุณไปยังตาราง temp ที่จะตั้งชื่อเป็น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
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;
public
)
ดังที่เปาโลกล่าวถึงการนำเข้าทำงานใน pgAdmin:
คลิกขวาที่ตาราง -> นำเข้า
เลือกไฟล์ท้องถิ่นรูปแบบและการเข้ารหัส
นี่คือภาพหน้าจอ GUI pgAdmin GUI ของเยอรมัน:
สิ่งที่คล้ายกันคุณสามารถทำกับ DbVisualizer (ฉันมีใบอนุญาตไม่แน่ใจเกี่ยวกับรุ่นฟรี)
คลิกขวาที่ตาราง -> นำเข้าข้อมูลตาราง ...
COPY table_name FROM 'path/to/data.csv' DELIMITER ',' CSV HEADER;
สร้างตารางก่อน
จากนั้นใช้คำสั่ง copy เพื่อคัดลอกรายละเอียดตาราง:
คัดลอก table_name (C1, C2, C3 .... )
จาก 'เส้นทางไปยังไฟล์ csv ของคุณ' ตัวคั่น ',' ส่วนหัว csv;
ขอบคุณ
ใช้รหัส SQL นี้
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
คำหลักส่วนหัวช่วยให้ DBMS รู้ว่าไฟล์ csv มีส่วนหัวที่มีคุณสมบัติ
สำหรับการเยี่ยมชมhttp://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/ เพิ่มเติม
ประสบการณ์ส่วนตัวกับ 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 ไม่มีสิทธิ์เข้าถึงเซิร์ฟเวอร์คุณจะต้องนำเข้าไฟล์. csv ผ่าน pgAdmin ที่มีอยู่ในฟังก์ชัน
คลิกขวาที่ชื่อตารางเลือกนำเข้า
หากคุณยังคงมีปัญหาโปรดอ้างอิงบทช่วยสอนนี้ http://www.postgresqltutorial.com/import-csv-file-into-posgresql-table/
จะนำเข้าข้อมูลไฟล์ 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;
IMHO วิธีที่สะดวกที่สุดคือปฏิบัติตาม " นำเข้าข้อมูล CSV ลงใน postgresql วิธีที่สะดวกสบาย ;-) " โดยใช้csvsqlจากcsvkitซึ่งเป็นแพคเกจหลามที่สามารถติดตั้งผ่าน pip
ใน 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)
มันค่อนข้างเร็วฉันสามารถนำเข้ามากกว่า 3.3 ล้านแถวในเวลาประมาณ 4 นาที
นอกจากนี้คุณยังสามารถใช้pgfutterหรือดียิ่งขึ้นpgcsv
pgfutter ค่อนข้างบั๊กนี่ฉันขอแนะนำ pgcsv อีกครั้ง
นี่คือวิธีการทำกับ pgcsv:
sudo pip install pgcsv
pgcsv --db 'postgresql://localhost/postgres?user=postgres&password=...' my_table my_file.csv
หากคุณต้องการกลไกอย่างง่ายในการนำเข้าจาก text / parse multiline 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;
DBeaver Community Edition (dbeaver.io) ทำให้เชื่อมต่อกับฐานข้อมูลได้ง่ายจากนั้นนำเข้าไฟล์ CSV เพื่ออัปโหลดไปยังฐานข้อมูล PostgreSQL นอกจากนี้ยังทำให้ง่ายต่อการออกแบบสอบถามเรียกข้อมูลและชุดผลลัพธ์การดาวน์โหลดเป็น CSV, JSON, SQL หรือรูปแบบข้อมูลทั่วไปอื่น ๆ
มันเป็นเครื่องมือฐานข้อมูลแบบหลายแพลตฟอร์ม FOSS สำหรับโปรแกรมเมอร์ SQL, DBAs และนักวิเคราะห์ที่สนับสนุนฐานข้อมูลยอดนิยมทั้งหมด: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto ฯลฯ มันเป็นคู่แข่ง FOSS ที่ทำงานได้เพื่อ TOAD สำหรับ Postgres, TOAD สำหรับ SQL Server หรือ Toad สำหรับ Oracle
ฉันไม่มีส่วนเกี่ยวข้องกับ DBeaver ฉันชอบราคา (ฟรี!) และฟังก์ชั่นเต็มรูปแบบ แต่ฉันหวังว่าพวกเขาจะเปิดแอปพลิเคชัน DBeaver / Eclipse นี้ให้มากขึ้นและทำให้ง่ายต่อการเพิ่มวิดเจ็ตการวิเคราะห์ลงใน DBeaver / Eclipse แทนที่จะต้องการให้ผู้ใช้จ่ายเงิน เพื่อสร้างกราฟและแผนภูมิโดยตรงภายในแอปพลิเคชัน ทักษะการเขียนโค้ด Java ของฉันมีสนิมและฉันไม่รู้สึกอยากใช้เวลาหลายสัปดาห์เพื่อเรียนรู้วิธีสร้างวิดเจ็ต Eclipse (เฉพาะเมื่อพบว่า DBeaver อาจปิดการใช้งานความสามารถในการเพิ่มวิดเจ็ตของบุคคลที่สามใน DBeaver Community Edition)
ผู้ใช้ DBeaver ที่เป็นผู้พัฒนา Java สามารถให้ข้อมูลเชิงลึกเกี่ยวกับขั้นตอนในการสร้างวิดเจ็ตการวิเคราะห์เพื่อเพิ่มลงใน Community Edition ของ DBeaver หรือไม่
สร้างตารางและมีคอลัมน์ที่จำเป็นที่ใช้สำหรับการสร้างตารางในไฟล์ csv
เปิด postgres และคลิกขวาที่ตารางเป้าหมายที่คุณต้องการในการโหลดและเลือกการนำเข้าและการปรับปรุงขั้นตอนต่อไปนี้ในตัวเลือกไฟล์ส่วน
เรียกดูไฟล์ของคุณในชื่อไฟล์
เลือก csv ในรูปแบบ
เข้ารหัสเป็น ISO_8859_5
ตอนนี้ไปที่อื่น ๆ ตัวเลือกและตรวจสอบส่วนหัวและคลิกที่นำเข้า
ฉันสร้างเครื่องมือขนาดเล็กที่นำเข้าcsv
ไฟล์ลงใน PostgreSQL ง่ายสุด ๆ เพียงแค่คำสั่งและมันจะสร้างและเติมข้อมูลในตารางโชคไม่ดีในขณะนี้ทุกเขตข้อมูลที่สร้างขึ้นโดยอัตโนมัติใช้ประเภท TEXT
csv2pg users.csv -d ";" -H 192.168.99.100 -U postgres -B mydatabase
เครื่องมือสามารถพบได้ที่https://github.com/eduardonunesp/csv2pg
psql -h 192.168.99.100 -U postgres mydatabase -c "COPY users FROM 'users.csv' DELIMITER ';' CSV"
? ฉันเดาว่าส่วนที่สร้างตารางดี แต่เนื่องจากทุกฟิลด์เป็นข้อความจึงไม่มีประโยชน์มากนัก