PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como posso importar dados de ASCII (ISO/IEC 8859-1) para meu banco de dados Rails/PGSQL?


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.