ZIP-filen innehåller ett antal filer:
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
som var och en verkar vara i ett bisarrt nästan CSV-liknande format, t.ex. NUTR_DEF.txt
:
~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
plus sr26_doc.pdf
, dokumentationen.
Skapa tabelldefinitioner
Så vad du behöver göra här är att skapa SQL-tabelldefinitioner för databasen - med en tabell för varje indatafil. Du behöver CREATE TABLE
kommando för detta; se PostgreSQL-dokumentationen.
Sidan 35 i PDF-filen bör hjälpa dig - "Figur 1. Relationer mellan filer i USDA National Nutrient Database for Standard Reference". Följande sidor beskriver filformaten och berättar vad varje kolumn betyder. Du kan skriva CREATE TABLE
uttalanden baserade på denna beskrivning.
Här är ett exempel för FOOD_DES.txt
(matbeskrivning), den första posten.
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)
);
Det är en ganska bokstavlig kopia av beskrivningen. Det är inte så jag skulle designa bordet
Jag har använt NUMERIC
godtycklig precision decimal flyttalstyper för noggrannhet i icke-heltals numeriska typer. Om prestanda är viktigare än noggrannhet kan du använda float4
istället.
För relationer använder du FOREIGN KEY
begränsningar - bara colname coltype REFERENCES othertable(othercol)
är tillräckligt för att skapa en.
Viktigt :Jag dubbelciterade kolumnnamnen för att behålla samma namn som i definitionerna. Det betyder att du alltid måste dubbelcitera dem när du refererar till dem, t.ex. SELECT "NDB_No" FROM food_des;
. Om du inte vill det är det bara att lämna de dubbla citattecken – eller välja andra namn. Du behöver inte hålla dig till de klumpiga förkortade kolumnnamnen de använde, och det är ganska rimligt att skriva:
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),
etc. På samma sätt, om du arbetar med Rails, kan du konvertera tabelldefinitionerna så att de följer Rails konventioner, speciellt om du sedan tänker ladda data via Rails.
Laddar data
Om dessa var förnuftiga, förnuftiga avgränsade filer kunde du sedan bara ladda varje tabell med psql
kommandot \copy
, eller PgAdmin-III:s "import"-alternativ.
Det är faktiskt CSV, de har precis bestämt sig för att använda helt bisarra avgränsare och citattecken. Importera via psql
med:
\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
eller motsvarande i vilket verktyg du än använder för att prata med PostgreSQL.
Resultaten är en förnuftig tabell:
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)
På samma sätt, om du använder Rails kan du använda vilket Rails CSV-bibliotek du vill och massladda in i modeller.