PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso importare dati da ASCII (ISO/IEC 8859-1) al mio database Rails/PGSQL?

Lo zip contiene un numero di file:

  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         

ognuno dei quali sembra essere in un formato bizzarro quasi simile a CSV, ad es. NUTR_DEF.txt :

~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~

più sr26_doc.pdf , la documentazione.

Creazione di definizioni di tabelle

Quindi quello che devi fare qui è creare definizioni di tabella SQL per il database, con una tabella per ogni file di input. Hai bisogno di CREATE TABLE comando per questo; vedere la documentazione di PostgreSQL.

La pagina 35 del PDF dovrebbe aiutarti - "Figura 1. Relazioni tra i file nel database nazionale dei nutrienti dell'USDA per riferimento standard". Le pagine seguenti descrivono i formati di file, indicando il significato di ciascuna colonna. Puoi scrivere CREATE TABLE affermazioni basate su questa descrizione.

Ecco un esempio, per FOOD_DES.txt (descrizione del cibo), la prima voce.

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)
);

Questa è una copia abbastanza letterale della descrizione. Non è così che disegnerei il tavolo

Ho usato NUMERIC tipi decimali a virgola mobile a precisione arbitraria per la precisione nei tipi numerici non interi. Se le prestazioni sono più importanti della precisione, puoi utilizzare float4 invece.

Per le relazioni, usi FOREIGN KEY vincoli - solo colname coltype REFERENCES othertable(othercol) è sufficiente crearne uno.

Importante :ho citato due volte i nomi delle colonne per preservare lo stesso nome delle definizioni. Ciò significa che devi sempre citarli due volte quando ti riferisci a loro, ad es. SELECT "NDB_No" FROM food_des; . Se non lo desideri, lascia fuori le virgolette doppie o scegli nomi diversi. Non devi attenerti ai nomi abbreviati delle colonne goffi che usavano ed è abbastanza ragionevole scrivere:

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),

ecc. Allo stesso modo, se stai lavorando con Rails, puoi convertire le definizioni delle tabelle per seguire le convenzioni di Rails, specialmente se poi intendi caricare i dati tramite Rails.

Caricamento dati

Se questi fossero file delimitati sani e sensati, potresti semplicemente caricare ogni tabella usando psql comando \copy o l'opzione "importa" di PgAdmin-III.

In realtà è CSV, hanno appena deciso di utilizzare delimitatori e virgolette totalmente bizzarri. Importa tramite psql con:

\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');

o l'equivalente in qualsiasi strumento tu usi per parlare con PostgreSQL.

I risultati sono una tabella dall'aspetto ragionevole:

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)

Allo stesso modo, se usi Rails puoi usare qualsiasi libreria CSV Rails che desideri e caricare in blocco nei modelli.