Soubor zip obsahuje několik souborů:
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
každý z nich se zdá být v bizarním formátu téměř podobném CSV, např. NUTR_DEF.txt
:
~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
plus sr26_doc.pdf
, dokumentaci.
Vytvoření definic tabulek
Zde tedy musíte vytvořit definice SQL tabulek pro databázi – s jednou tabulkou pro každý vstupní soubor. Potřebujete CREATE TABLE
příkaz k tomu; viz dokumentace PostgreSQL.
Pomoci by vám měla strana 35 PDF – „Obrázek 1. Vztahy mezi soubory v USDA National Nutrient Database for Standard Reference“. Následující stránky popisují formáty souborů a řeknou vám, co jednotlivé sloupce znamenají. Můžete napsat CREATE TABLE
prohlášení založená na tomto popisu.
Zde je příklad pro FOOD_DES.txt
(popis jídla), první záznam.
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)
);
To je docela doslovná kopie popisu. Není to tak, jak bych navrhl stůl
Použil jsem NUMERIC
s libovolnou přesností desetinných typů s plovoucí desetinnou čárkou pro přesnost v neceločíselných numerických typech. Pokud je výkon důležitější než přesnost, můžete použít float4
místo toho.
Pro vztahy se používá FOREIGN KEY
omezení - stačí colname coltype REFERENCES othertable(othercol)
stačí vytvořit jeden.
Důležité :Názvy sloupců jsem uvedl v uvozovkách, abych zachoval stejný název jako v definicích. To znamená, že je musíte vždy citovat dvakrát, když na ně odkazujete, např. SELECT "NDB_No" FROM food_des;
. Pokud to nechcete, jednoduše vynechejte dvojité uvozovky – nebo vyberte jiná jména. Nemusíte se držet neohrabaných zkrácených názvů sloupců, které používali, a je docela rozumné napsat:
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),
atd. Podobně, pokud pracujete s Rails, můžete převést definice tabulek tak, aby odpovídaly konvencím Rails, zvláště pokud pak zamýšlíte načítání dat přes Rails.
Načítání dat
Pokud by se jednalo o rozumné a rozumné soubory s oddělovači, mohli byste každou tabulku načíst pomocí psql
příkaz \copy
, nebo možnost "importovat" PgAdmin-III.
Je to vlastně CSV, právě se rozhodli použít naprosto bizarní oddělovač a citovat znaky. Import přes psql
s:
\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
nebo ekvivalent v jakémkoli nástroji, který používáte pro komunikaci s PostgreSQL.
Výsledkem je rozumně vypadající tabulka:
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)
Podobně, pokud používáte Rails, můžete použít jakoukoli knihovnu CSV Rails a hromadně načíst modely.