sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik gegevens uit ASCII (ISO/IEC 8859-1) importeren in mijn Rails/PGSQL-database?

De zip bevat een aantal bestanden:

  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         

die elk in een bizar, bijna CSV-achtig formaat lijken te zijn, b.v. NUTR_DEF.txt :

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

plus sr26_doc.pdf , de documentatie.

Tabeldefinities maken

Dus wat u hier moet doen, is SQL-tabeldefinities voor de database maken - met één tabel voor elk invoerbestand. Je hebt de CREATE TABLE . nodig opdracht hiervoor; zie de PostgreSQL-documentatie.

Pagina 35 van de PDF zou u moeten helpen - "Figuur 1. Relaties tussen bestanden in de USDA National Nutrient Database for Standard Reference". De volgende pagina's beschrijven de bestandsindelingen en vertellen u wat elke kolom betekent. U kunt CREATE TABLE . schrijven uitspraken op basis van deze beschrijving.

Hier is een voorbeeld voor FOOD_DES.txt (voedselbeschrijving), het eerste item.

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

Dat is een vrij letterlijke kopie van de beschrijving. Zo zou ik de tafel niet ontwerpen

Ik heb NUMERIC . gebruikt willekeurige precisie decimale drijvende-komma typen voor nauwkeurigheid in niet-gehele numerieke typen. Als prestaties belangrijker zijn dan nauwkeurigheid, kunt u float4 . gebruiken in plaats daarvan.

Voor relaties gebruik je FOREIGN KEY beperkingen - gewoon colname coltype REFERENCES othertable(othercol) is voldoende om er een te maken.

Belangrijk :Ik heb de kolomnamen dubbel geciteerd om dezelfde naam als in de definities te behouden. Dat betekent dat je ze altijd dubbel moet citeren als je ernaar verwijst, b.v. SELECT "NDB_No" FROM food_des; . Als je dat niet wilt, laat dan de dubbele aanhalingstekens weg - of kies andere namen. Je hoeft je niet te houden aan de onhandige afgekorte kolomnamen die ze gebruikten, en het is redelijk om te schrijven:

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

enz. Evenzo, als u met Rails werkt, kunt u de tabeldefinities converteren om de conventies van Rails te volgen, vooral als u vervolgens van plan bent de gegevens via Rails te laden.

Gegevens laden

Als dit normale, verstandige, gescheiden bestanden waren, kon je elke tabel gewoon laden met de psql commando \copy , of de "import"-optie van PgAdmin-III.

Het is eigenlijk CSV, ze hebben zojuist besloten om totaal bizarre scheidingstekens en aanhalingstekens te gebruiken. Importeren via psql met:

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

of het equivalent in welke tool je ook gebruikt om met PostgreSQL te praten.

De resultaten zijn een verstandig ogende tabel:

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)

Evenzo, als je Rails gebruikt, kun je elke Rails CSV-bibliotheek gebruiken die je wilt en bulksgewijs in modellen laden.



  1. Meerdere (3+) tabellen samenvoegen in één verklaring

  2. SQLite JSON_OBJECT()

  3. Is er een manier om geen vierkante haken te gebruiken in SQL Server?

  4. SQL SELECTEER MAX