Lo zip contiene un numero di 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
ognuno dei quali sembra essere in un formato bizzarro quasi simile a CSV, ad es. NUTR_DEF.txt
:
~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
più sr26_doc.pdf
, la documentazione.
Creazione di definizioni di tabelle
Quindi quello che devi fare qui è creare definizioni di tabella SQL per il database, con una tabella per ogni file di input. Hai bisogno di CREATE TABLE
comando per questo; vedere la documentazione di PostgreSQL.
La pagina 35 del PDF dovrebbe aiutarti - "Figura 1. Relazioni tra i file nel database nazionale dei nutrienti dell'USDA per riferimento standard". Le pagine seguenti descrivono i formati di file, indicando il significato di ciascuna colonna. Puoi scrivere CREATE TABLE
affermazioni basate su questa descrizione.
Ecco un esempio, per FOOD_DES.txt
(descrizione del cibo), la prima voce.
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)
);
Questa è una copia abbastanza letterale della descrizione. Non è così che disegnerei il tavolo
Ho usato NUMERIC
tipi decimali a virgola mobile a precisione arbitraria per la precisione nei tipi numerici non interi. Se le prestazioni sono più importanti della precisione, puoi utilizzare float4
invece.
Per le relazioni, usi FOREIGN KEY
vincoli - solo colname coltype REFERENCES othertable(othercol)
è sufficiente crearne uno.
Importante :ho citato due volte i nomi delle colonne per preservare lo stesso nome delle definizioni. Ciò significa che devi sempre citarli due volte quando ti riferisci a loro, ad es. SELECT "NDB_No" FROM food_des;
. Se non lo desideri, lascia fuori le virgolette doppie o scegli nomi diversi. Non devi attenerti ai nomi abbreviati delle colonne goffi che usavano ed è abbastanza ragionevole scrivere:
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),
ecc. Allo stesso modo, se stai lavorando con Rails, puoi convertire le definizioni delle tabelle per seguire le convenzioni di Rails, specialmente se poi intendi caricare i dati tramite Rails.
Caricamento dati
Se questi fossero file delimitati sani e sensati, potresti semplicemente caricare ogni tabella usando psql
comando \copy
o l'opzione "importa" di PgAdmin-III.
In realtà è CSV, hanno appena deciso di utilizzare delimitatori e virgolette totalmente bizzarri. Importa tramite psql
con:
\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
o l'equivalente in qualsiasi strumento tu usi per parlare con PostgreSQL.
I risultati sono una tabella dall'aspetto ragionevole:
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)
Allo stesso modo, se usi Rails puoi usare qualsiasi libreria CSV Rails che desideri e caricare in blocco nei modelli.