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.