ZIP кодът съдържа няколко файла:
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
всеки от които изглежда е в странен почти CSV формат, напр. NUTR_DEF.txt
:
~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
плюс sr26_doc.pdf
, документацията.
Създаване на дефиниции на таблици
Така че това, което трябва да направите тук, е да създадете дефиниции на SQL таблици за базата данни - с една таблица за всеки входен файл. Нуждаете се от CREATE TABLE
команда за това; вижте документацията на PostgreSQL.
Страница 35 от PDF трябва да ви помогне - "Фигура 1. Връзки между файловете в Националната база данни за хранителни вещества на USDA за стандартна справка". Следващите страници описват файловите формати, като ви казват какво означава всяка колона. Можете да напишете CREATE TABLE
твърдения, базирани на това описание.
Ето един пример за FOOD_DES.txt
(описание на храната), първият запис.
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)
);
Това е доста буквално копие на описанието. Не е начинът, по който бих проектирал масата
Използвах NUMERIC
десетични типове с плаваща запетая с произволна точност за точност при нецелочислени типове. Ако производителността е по-важна от точността, можете да използвате float4
вместо това.
За връзки използвате FOREIGN KEY
ограничения - просто colname coltype REFERENCES othertable(othercol)
е достатъчно, за да създадете такъв.
Важно :Цитирах два пъти имената на колоните, за да запазя същото име като в дефинициите. Това означава, че винаги трябва да ги цитирате, когато ги позовавате, напр. SELECT "NDB_No" FROM food_des;
. Ако не искате това, просто пропуснете двойните кавички - или изберете различни имена. Не е нужно да се придържате към тромавите съкратени имена на колони, които са използвали, и е съвсем разумно да напишете:
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),
и т.н. По същия начин, ако работите с Rails, можете да конвертирате дефинициите на таблицата, за да следвате конвенциите на Rails, особено ако след това възнамерявате да извършите зареждането на данни чрез Rails.
Данните се зареждат
Ако това бяха разумни, разумни файлове с разделители, тогава бихте могли просто да заредите всяка таблица с помощта на psql
команда \copy
, или опцията "импорт" на PgAdmin-III.
Всъщност това е CSV, те просто са решили да използват напълно странни символи за разделители и кавички. Импортирайте чрез psql
с:
\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
или еквивалента във всеки инструмент, който използвате, за да говорите с PostgreSQL.
Резултатите са разумно изглеждаща таблица:
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)
По същия начин, ако използвате Rails, можете да използвате каквато желаете Rails CSV библиотека и да зареждате групово в модели.