मैं एक संग्रहीत प्रक्रिया कैसे लिख सकता हूं जो CSV फ़ाइल से डेटा आयात करती है और तालिका को पॉप्युलेट करती है?
मैं एक संग्रहीत प्रक्रिया कैसे लिख सकता हूं जो CSV फ़ाइल से डेटा आयात करती है और तालिका को पॉप्युलेट करती है?
जवाबों:
इस छोटे लेख पर एक नज़र डालें ।
समाधान यहाँ paraphrased:
अपनी तालिका बनाएँ:
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 के लिए दस्तावेज देखें :
साइक अनुदेश \ कॉपी के साथ कॉपी को भ्रमित न करें। \ copy STDIN से COPY को कॉपी करता है या STDOUT को कॉपी करता है, और फिर psql क्लाइंट के लिए सुलभ फ़ाइल में डेटा संग्रहीत / संग्रहीत करता है। इस प्रकार, फ़ाइल की पहुँच और पहुँच अधिकार क्लाइंट पर निर्भर करते हैं न कि सर्वर पर जब \ copy का उपयोग किया जाता है।
और ध्यान दें:
पहचान स्तंभों के लिए, COPY FROM कमांड हमेशा इनपुट डेटा में प्रदान किए गए कॉलम मानों को लिखेगा, जैसे INSERT विकल्प OVERRIDING SYSTEM VALUE।
COPY
और \copy
भी बहुत कुछ बस अनुमतियों से है, और आप बस एक `` इसे बनाने के लिए जादुई काम नहीं जोड़ सकते। विवरण (निर्यात के संदर्भ में) यहां देखें: stackoverflow.com/a/1517692/157957
ऐसा करने का एक त्वरित तरीका पायथन पांडा लाइब्रेरी (संस्करण 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')
df.to_sql()
वास्तव में धीमा है, आप d6tstackd6tstack.utils.pd_to_psql()
से प्रदर्शन तुलना देख सकते हैं
आप pgAdmin का उपयोग भी कर सकते हैं, जो आयात करने के लिए GUI प्रदान करता है। यह इस SO थ्रेड में दिखाया गया है । PgAdmin का उपयोग करने का लाभ यह है कि यह दूरस्थ डेटाबेस के लिए भी काम करता है।
हालांकि पिछले समाधानों की तरह, आपको डेटाबेस पर अपनी तालिका पहले से ही रखनी होगी। प्रत्येक व्यक्ति का अपना समाधान होता है, लेकिन मैं आमतौर पर एक्सेल में CSV खोलता हूं, हेडर की प्रतिलिपि बनाता हूं, विशेष वर्कशीट पर ट्रांसपोजेशन के साथ विशेष पेस्ट करता हूं, इसी डेटा टाइप को अगले कॉलम पर रखता हूं, बस कॉपी करता हूं और टेक्स्ट एडिटर पर पेस्ट करता हूं उपयुक्त SQL तालिका निर्माण क्वेरी के साथ एक साथ:
CREATE TABLE my_table (
/*paste data from Excel here for example ... */
col_1 bigint,
col_2 bigint,
/* ... */
col_n bigint
)
यहां अधिकांश अन्य समाधानों के लिए आवश्यक है कि आप पहले से / मैन्युअल रूप से तालिका बनाएं। यह कुछ मामलों में व्यावहारिक नहीं हो सकता है (जैसे, यदि आपके पास गंतव्य तालिका में बहुत सारे कॉलम हैं)। तो, नीचे का दृष्टिकोण काम आ सकता है।
अपनी सीएसवी फ़ाइल का पथ और स्तंभ गणना प्रदान करते हुए, आप अपनी तालिका को एक अस्थायी तालिका में लोड करने के लिए निम्न फ़ंक्शन का उपयोग कर सकते हैं जिसे निम्न नाम दिया जाएगा 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 में काम करता है:
तालिका -> आयात पर राइट क्लिक करें
स्थानीय फ़ाइल, प्रारूप और कोडिंग का चयन करें
यहाँ एक जर्मन pgAdmin GUI स्क्रीनशॉट है:
इसी तरह की बात आप DbVisualizer के साथ कर सकते हैं (मेरे पास लाइसेंस है, मुफ्त संस्करण के बारे में निश्चित नहीं है)
एक टेबल पर राइट क्लिक करें -> टेबल डेटा आयात करें ...
पहले एक तालिका बनाएं
तब तालिका विवरण कॉपी करने के लिए कॉपी कमांड का उपयोग करें:
copy table_name (C1, C2, C3 ....)
से सीमांकक ',' CSV हेडर 'पथ अपनी csv फ़ाइल के लिए';
धन्यवाद
इस SQL कोड का उपयोग करें
copy table_name(atribute1,attribute2,attribute3...)
from 'E:\test.csv' delimiter ',' csv header
हेडर कीवर्ड डीबीएमएस को बताता है कि सीएसवी फ़ाइल में विशेषताओं के साथ हेडर है
अधिक यात्रा के लिए 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 को सर्वर तक पहुंचने की अनुमति नहीं होती है, आपको कार्यक्षमता में निर्मित pgAdmin के माध्यम से .csv फ़ाइल आयात करनी होगी।
आयात का चयन करें तालिका नाम पर राइट क्लिक करें।
यदि आपको अभी भी समस्या है, तो कृपया इस ट्यूटोरियल को देखें। 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
);
सीएसवी फ़ाइल डेटा को पोस्टग्रेजेकल में आयात करें
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, सबसे सुविधाजनक तरीका है " सीएसवी डेटा को पोस्टग्रैसिकल में आयात करें, आरामदायक तरीका ;-) " का पालन करें , सीएसवीक से सीएसवीस्कल का उपयोग करना , जो कि पाइप के माध्यम से स्थापित अजगर पैकेज है।
पायथन में, आप कॉलम नामों के साथ स्वचालित 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 मिनट में 3.3 मिलियन से अधिक पंक्तियों को आयात कर सकता हूं।
तुम भी pgfutter का उपयोग कर सकते हैं , या, और भी बेहतर, pgcsv ।
pgfutter काफी छोटी गाड़ी है, मैं pgcsv को पुनः प्राप्त करूँगा।
यहाँ यह pgcsv के साथ कैसे करें:
sudo pip install pgcsv
pgcsv --db 'postgresql://localhost/postgres?user=postgres&password=...' my_table my_file.csv
यदि आपको टेक्स्ट / पार्स मल्टीलाइन 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 सामुदायिक संस्करण (dbeaver.io) इसे डेटाबेस से कनेक्ट करने के लिए तुच्छ बनाता है, फिर एक PostgreSQL डेटाबेस पर अपलोड के लिए CSV फ़ाइल आयात करें। यह प्रश्नों को जारी करना, डेटा पुनर्प्राप्त करना और CSV, JSON, SQL, या अन्य सामान्य डेटा प्रारूपों के लिए परिणाम सेट डाउनलोड करना आसान बनाता है।
यह SQL प्रोग्रामर, DBA और विश्लेषकों के लिए एक FOSS मल्टी-प्लेटफ़ॉर्म डेटाबेस टूल है जो सभी लोकप्रिय डेटाबेस का समर्थन करता है: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, आदि। यह पोस्टग्रैड्स के लिए TOAD, SQL सर्वर के लिए TOAD, या Oracle के लिए टॉड के लिए एक व्यवहार्य FOSS प्रतियोगी है।
DBeaver के साथ मेरा कोई जुड़ाव नहीं है। मुझे कीमत (मुफ़्त!) और पूर्ण कार्यक्षमता पसंद है, लेकिन मेरी इच्छा है कि वे इस DBeaver / ग्रहण एप्लिकेशन को और खोलेंगे और DBeaver / Eclipse में एनालिटिक्स विजेट जोड़ना आसान कर देंगे, बजाय इसके कि उपयोगकर्ताओं को $ 199 वार्षिक सदस्यता के लिए भुगतान करने की आवश्यकता हो। सीधे आवेदन के भीतर रेखांकन और चार्ट बनाने के लिए। मेरे जावा कोडिंग कौशल जंग खाए हुए हैं और मुझे लगता है कि ग्रहण विजेट्स का निर्माण करने के तरीके को दूर करने के लिए हफ्तों का समय नहीं लगता है, (केवल यह खोजने के लिए कि डीबीएवर ने संभवत: डीबीएवर सामुदायिक संस्करण में तीसरे पक्ष के विजेट को जोड़ने की क्षमता को अक्षम कर दिया है।)
क्या DBeaver पावर उपयोगकर्ता जो Java डेवलपर हैं, वे DBeaver के कम्युनिटी एडिशन में जोड़ने के लिए एनालिटिक्स विजेट बनाने के चरणों के बारे में कुछ जानकारी प्रदान कर सकते हैं?
तालिका बनाएँ और आवश्यक स्तंभ हैं जो सीएसवी फ़ाइल में तालिका बनाने के लिए उपयोग किए जाते हैं।
पोस्टग्रेट्स खोलें और लक्ष्य तालिका पर राइट क्लिक करें जिसे आप आयात करना चाहते हैं और फ़ाइल विकल्प अनुभाग में निम्नलिखित चरणों को अपडेट करना चाहते हैं
अब फ़ाइल नाम में अपनी फ़ाइल ब्राउज़ करें
प्रारूप में 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"
? मुझे लगता है कि वह हिस्सा जहां यह टेबल बनाता है वह अच्छा है, लेकिन चूंकि हर क्षेत्र टेक्स्ट है यह सुपर उपयोगी नहीं है