CSG फ़ाइल डेटा को PostgreSQL तालिका में कैसे आयात करें?



Answers

यदि आपके पास COPY (जो डीबी सर्वर पर काम करता है) का उपयोग करने की अनुमति नहीं है, तो आप इसके बजाय \copy उपयोग कर सकते हैं (जो डीबी क्लाइंट में काम करता है)। 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);

अपनी सीएसवी फ़ाइल से डेटा को तालिका में कॉपी करें:

\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
Question

मैं एक संग्रहित प्रक्रिया कैसे लिख सकता हूं जो CSV फ़ाइल से डेटा आयात करता है और तालिका को पॉप्युलेट करता है?




यहां अधिकांश अन्य समाधानों की आवश्यकता है कि आप तालिका को अग्रिम / मैन्युअल रूप से बनाएं। यह कुछ मामलों में व्यावहारिक नहीं हो सकता है (उदाहरण के लिए, यदि आपके पास गंतव्य तालिका में बहुत से कॉलम हैं)। तो, नीचे दृष्टिकोण आसान हो सकता है।

अपनी सीएसवी फ़ाइल का पथ और कॉलम गिनती प्रदान करना, आप अपनी तालिका को एक temp तालिका में लोड करने के लिए निम्न फ़ंक्शन का उपयोग कर सकते हैं जिसे target_table रूप में नामित किया 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;



आप pgAdmin का भी उपयोग कर सकते हैं, जो आयात करने के लिए एक जीयूआई प्रदान करता है। यह इस एसओ धागे में दिखाया गया है। PgAdmin का उपयोग करने का लाभ यह है कि यह दूरस्थ डेटाबेस के लिए भी काम करता है।

हालांकि पिछले समाधान की तरह, आपको पहले से ही डेटाबेस पर अपनी टेबल रखना होगा। प्रत्येक व्यक्ति का अपना समाधान होता है लेकिन मैं आमतौर पर जो करता हूं वह एक्सेल में सीएसवी खोलता है, हेडर कॉपी करता है, एक अलग वर्कशीट पर ट्रांसपोजिशन के साथ विशेष पेस्ट करता है, अगले कॉलम पर संबंधित डेटा प्रकार रखता है, फिर उसे टेक्स्ट एडिटर में कॉपी और पेस्ट करें एक साथ उचित SQL तालिका निर्माण क्वेरी के साथ:

CREATE TABLE my_table (
    /*paste data from Excel here for example ... */
    col_1 bigint,
    col_2 bigint,
    /* ... */
    col_n bigint 
)






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/




यदि आपको टेक्स्ट / पार्स मल्टीलाइन सीएसवी से आयात करने के लिए सरल तंत्र की आवश्यकता है तो आप इसका उपयोग कर सकते हैं:

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;

डीबीफिल्ड डेमो




Related