PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana saya bisa mengimpor data dari ASCII (ISO/IEC 8859-1) ke database Rails/PGSQL saya?

Zip berisi sejumlah file:

  inflating: DATA_SRC.txt            
  inflating: DATSRCLN.txt            
  inflating: DERIV_CD.txt            
  inflating: FD_GROUP.txt            
  inflating: FOOD_DES.txt            
  inflating: FOOTNOTE.txt            
  inflating: LANGDESC.txt            
  inflating: LANGUAL.txt             
  inflating: NUT_DATA.txt            
  inflating: NUTR_DEF.txt            
  inflating: sr26_doc.pdf            
  inflating: SRC_CD.txt              
  inflating: WEIGHT.txt         

yang masing-masing tampak dalam format aneh yang hampir mirip CSV, mis. NUTR_DEF.txt :

~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~

ditambah sr26_doc.pdf , dokumentasi.

Membuat definisi tabel

Jadi yang perlu Anda lakukan di sini adalah membuat definisi tabel SQL untuk database - dengan satu tabel untuk setiap file input. Anda memerlukan CREATE TABLE perintah untuk ini; lihat dokumentasi PostgreSQL.

Halaman 35 dari PDF akan membantu Anda - "Gambar 1. Hubungan antar file dalam Database Nutrisi Nasional USDA untuk Referensi Standar". Halaman berikut menjelaskan format file, memberi tahu Anda apa arti setiap kolom. Anda dapat menulis CREATE TABLE pernyataan berdasarkan deskripsi ini.

Berikut ini contohnya, untuk FOOD_DES.txt (deskripsi makanan), entri pertama.

CREATE TABLE food_des (
    "NDB_No"      varchar(5) NOT NULL PRIMARY KEY,
    "FdGrp_Cd"    varchar(4) NOT NULL,
    "Long_Desc"   varchar(200) NOT NULL,
    "Shrt_Desc"   varchar(60) NOT NULL,
    "ComName"     varchar(100),
    "ManufacName" varchar(65),
    "Survey"      varchar(1),
    "Ref_desc"    varchar(135),
    "Refuse"      smallint,
    "SciName"     varchar(65),
    "N_Factor"    NUMERIC(4,2),
    "Pro_Factor"  NUMERIC(4,2),
    "Fat_Factor"  NUMERIC(4,2),
    "CHO_Factor"  NUMERIC(4,2)
);

Itu salinan deskripsi yang cukup literal. Ini bukan cara saya mendesain tabel

Saya telah menggunakan NUMERIC tipe titik mengambang desimal presisi arbitrer untuk akurasi dalam tipe numerik non-integer. Jika kinerja lebih penting daripada akurasi, Anda dapat menggunakan float4 sebagai gantinya.

Untuk hubungan, Anda menggunakan FOREIGN KEY batasan - cukup colname coltype REFERENCES othertable(othercol) cukup untuk membuatnya.

Penting :Saya mengutip dua kali nama kolom untuk mempertahankan nama yang sama seperti dalam definisi. Itu berarti Anda harus selalu mengutipnya dua kali saat merujuknya, mis. SELECT "NDB_No" FROM food_des; . Jika Anda tidak menginginkannya, tinggalkan tanda kutip ganda - atau pilih nama yang berbeda. Anda tidak perlu terpaku pada singkatan nama kolom yang mereka gunakan, dan cukup masuk akal untuk menulis:

CREATE TABLE food_description (
    ndb_no              varchar(5) NOT NULL PRIMARY KEY,
    foodgroup_code      varchar(4) NOT NULL,
    long_description    varchar(200) NOT NULL,
    short_description   varchar(60) NOT NULL,
    common_name         varchar(100),
    manufacturer_name   varchar(65),

dll. Demikian pula, jika Anda bekerja dengan Rails, Anda dapat mengonversi definisi tabel untuk mengikuti konvensi Rails, terutama jika Anda ingin melakukan pemuatan data melalui Rails.

Memuat data

Jika ini adalah file yang dibatasi dan masuk akal, Anda dapat memuat setiap tabel menggunakan psql perintah \copy , atau opsi "impor" PgAdmin-III.

Ini sebenarnya CSV, mereka baru saja memutuskan untuk menggunakan karakter pembatas dan kutipan yang benar-benar aneh. Impor melalui psql dengan:

\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');

atau yang setara dengan alat apa pun yang Anda gunakan untuk berbicara dengan PostgreSQL.

Hasilnya adalah tabel yang terlihat masuk akal:

craig=> select * from food_des limit 2;
 NDB_No | FdGrp_Cd |         Long_Desc          |        Shrt_Desc         | ComName | ManufacName | Survey | Ref_desc | Refuse | SciName | N_Factor | Pro_Factor | Fat_Factor | CHO_Factor 
--------+----------+----------------------------+--------------------------+---------+-------------+--------+----------+--------+---------+----------+------------+------------+------------
 01001  | 0100     | Butter, salted             | BUTTER,WITH SALT         |         |             | Y      |          |      0 |         |     6.38 |       4.27 |       8.79 |       3.87
 01002  | 0100     | Butter, whipped, with salt | BUTTER,WHIPPED,WITH SALT |         |             | Y      |          |      0 |         |     6.38 |       4.27 |       8.79 |       3.87
(2 rows)

Demikian pula, jika menggunakan Rails, Anda dapat menggunakan pustaka CSV Rails apa pun yang Anda inginkan dan memuat secara massal ke dalam model.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memantau Kinerja PostgreSQL 12 dengan OmniDB – Bagian 2

  2. PostgreSQL di mana semua dalam array

  3. Ikhtisar Ekstensi Tepercaya di PostgreSQL 13

  4. Beberapa CTE dalam satu permintaan

  5. ActiveRecord::StatementInvalid:PG InFailedSqlTransaction