sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur kan jag importera data från ASCII (ISO/IEC 8859-1) till min Rails/PGSQL-databas?

ZIP-filen innehåller ett antal filer:

  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         

som var och en verkar vara i ett bisarrt nästan CSV-liknande format, t.ex. NUTR_DEF.txt :

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

plus sr26_doc.pdf , dokumentationen.

Skapa tabelldefinitioner

Så vad du behöver göra här är att skapa SQL-tabelldefinitioner för databasen - med en tabell för varje indatafil. Du behöver CREATE TABLE kommando för detta; se PostgreSQL-dokumentationen.

Sidan 35 i PDF-filen bör hjälpa dig - "Figur 1. Relationer mellan filer i USDA National Nutrient Database for Standard Reference". Följande sidor beskriver filformaten och berättar vad varje kolumn betyder. Du kan skriva CREATE TABLE uttalanden baserade på denna beskrivning.

Här är ett exempel för FOOD_DES.txt (matbeskrivning), den första posten.

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

Det är en ganska bokstavlig kopia av beskrivningen. Det är inte så jag skulle designa bordet

Jag har använt NUMERIC godtycklig precision decimal flyttalstyper för noggrannhet i icke-heltals numeriska typer. Om prestanda är viktigare än noggrannhet kan du använda float4 istället.

För relationer använder du FOREIGN KEY begränsningar - bara colname coltype REFERENCES othertable(othercol) är tillräckligt för att skapa en.

Viktigt :Jag dubbelciterade kolumnnamnen för att behålla samma namn som i definitionerna. Det betyder att du alltid måste dubbelcitera dem när du refererar till dem, t.ex. SELECT "NDB_No" FROM food_des; . Om du inte vill det är det bara att lämna de dubbla citattecken – eller välja andra namn. Du behöver inte hålla dig till de klumpiga förkortade kolumnnamnen de använde, och det är ganska rimligt att skriva:

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. På samma sätt, om du arbetar med Rails, kan du konvertera tabelldefinitionerna så att de följer Rails konventioner, speciellt om du sedan tänker ladda data via Rails.

Laddar data

Om dessa var förnuftiga, förnuftiga avgränsade filer kunde du sedan bara ladda varje tabell med psql kommandot \copy , eller PgAdmin-III:s "import"-alternativ.

Det är faktiskt CSV, de har precis bestämt sig för att använda helt bisarra avgränsare och citattecken. Importera via psql med:

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

eller motsvarande i vilket verktyg du än använder för att prata med PostgreSQL.

Resultaten är en förnuftig tabell:

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)

På samma sätt, om du använder Rails kan du använda vilket Rails CSV-bibliotek du vill och massladda in i modeller.



  1. SSRS-rapportdefinitionen är nyare än Server

  2. Vad är syftet med systemtabellens master..spt_values ​​och vad är betydelsen av dess värden?

  3. 9 viktiga uppgifter som DBA:er är ansvariga för

  4. Hämta föregående och nästa rad från rader valda med (WHERE) villkor