sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu importovat data z ASCII (ISO/IEC 8859-1) do své databáze Rails/PGSQL?

Soubor zip obsahuje několik souborů:

  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         

každý z nich se zdá být v bizarním formátu téměř podobném CSV, např. NUTR_DEF.txt :

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

plus sr26_doc.pdf , dokumentaci.

Vytvoření definic tabulek

Zde tedy musíte vytvořit definice SQL tabulek pro databázi – s jednou tabulkou pro každý vstupní soubor. Potřebujete CREATE TABLE příkaz k tomu; viz dokumentace PostgreSQL.

Pomoci by vám měla strana 35 PDF – „Obrázek 1. Vztahy mezi soubory v USDA National Nutrient Database for Standard Reference“. Následující stránky popisují formáty souborů a řeknou vám, co jednotlivé sloupce znamenají. Můžete napsat CREATE TABLE prohlášení založená na tomto popisu.

Zde je příklad pro FOOD_DES.txt (popis jídla), první záznam.

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

To je docela doslovná kopie popisu. Není to tak, jak bych navrhl stůl

Použil jsem NUMERIC s libovolnou přesností desetinných typů s plovoucí desetinnou čárkou pro přesnost v neceločíselných numerických typech. Pokud je výkon důležitější než přesnost, můžete použít float4 místo toho.

Pro vztahy se používá FOREIGN KEY omezení - stačí colname coltype REFERENCES othertable(othercol) stačí vytvořit jeden.

Důležité :Názvy sloupců jsem uvedl v uvozovkách, abych zachoval stejný název jako v definicích. To znamená, že je musíte vždy citovat dvakrát, když na ně odkazujete, např. SELECT "NDB_No" FROM food_des; . Pokud to nechcete, jednoduše vynechejte dvojité uvozovky – nebo vyberte jiná jména. Nemusíte se držet neohrabaných zkrácených názvů sloupců, které používali, a je docela rozumné napsat:

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

atd. Podobně, pokud pracujete s Rails, můžete převést definice tabulek tak, aby odpovídaly konvencím Rails, zvláště pokud pak zamýšlíte načítání dat přes Rails.

Načítání dat

Pokud by se jednalo o rozumné a rozumné soubory s oddělovači, mohli byste každou tabulku načíst pomocí psql příkaz \copy , nebo možnost "importovat" PgAdmin-III.

Je to vlastně CSV, právě se rozhodli použít naprosto bizarní oddělovač a citovat znaky. Import přes psql s:

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

nebo ekvivalent v jakémkoli nástroji, který používáte pro komunikaci s PostgreSQL.

Výsledkem je rozumně vypadající tabulka:

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)

Podobně, pokud používáte Rails, můžete použít jakoukoli knihovnu CSV Rails a hromadně načíst modely.



  1. Rozuzlení upgradu PostgreSQL

  2. Jak odstranit část řetězce v oracle

  3. Prohledejte všechny sloupce tabulky pomocí jediné podmínky where s jedním klíčovým slovem v mysql

  4. Více SQL, méně kódu, s PostgreSQL