O zip contém vários arquivos:
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
cada um dos quais parece estar em um formato bizarro quase semelhante ao CSV, por exemplo
NUTR_DEF.txt
:~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
mais
sr26_doc.pdf
, a documentação. Criando definições de tabela
Então, o que você precisa fazer aqui é criar definições de tabela SQL para o banco de dados - com uma tabela para cada arquivo de entrada. Você precisa do
CREATE TABLE
comando para isso; veja a documentação do PostgreSQL. A página 35 do PDF deve ajudá-lo - "Figura 1. Relações entre arquivos no Banco de Dados Nacional de Nutrientes do USDA para Referência Padrão". As páginas a seguir descrevem os formatos de arquivo, informando o que cada coluna significa. Você pode escrever
CREATE TABLE
declarações baseadas nesta descrição. Aqui está um exemplo, para
FOOD_DES.txt
(descrição do alimento), a primeira entrada. 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)
);
Essa é uma cópia bastante literal da descrição. Não é como eu projetaria a mesa
Eu usei
NUMERIC
tipos de ponto flutuante decimal de precisão arbitrária para precisão em tipos numéricos não inteiros. Se o desempenho for mais importante que a precisão, você pode usar float4
em vez de. Para relacionamentos, você usa
FOREIGN KEY
restrições - apenas colname coltype REFERENCES othertable(othercol)
é suficiente para criar um. Importante :coloquei aspas duplas nos nomes das colunas para preservar o mesmo nome nas definições. Isso significa que você sempre deve citá-los duas vezes quando se referir a eles, por exemplo.
SELECT "NDB_No" FROM food_des;
. Se você não quiser isso, basta deixar as aspas duplas - ou escolher nomes diferentes. Você não precisa se ater aos nomes de colunas abreviados e desajeitados que eles usaram, e é bastante razoável escrever: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. Da mesma forma, se você estiver trabalhando com Rails, você pode converter as definições de tabela para seguir as convenções do Rails, especialmente se você pretende fazer o carregamento de dados via Rails.
Carregando dados
Se estes fossem arquivos delimitados sensatos e sensatos, você poderia carregar cada tabela usando o
psql
comando \copy
, ou a opção "importar" do PgAdmin-III. Na verdade, é CSV, eles decidiram usar delimitador totalmente bizarro e caracteres de aspas. Importar via
psql
com:\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
ou o equivalente em qualquer ferramenta que você use para falar com o PostgreSQL.
Os resultados são uma tabela de aparência sensata:
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)
Da mesma forma, se estiver usando Rails, você pode usar qualquer biblioteca Rails CSV que desejar e carregar em massa em modelos.