PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich Daten aus ASCII (ISO/IEC 8859-1) in meine Rails/PGSQL-Datenbank importieren?

Die ZIP-Datei enthält eine Reihe von Dateien:

  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         

jedes davon scheint in einem bizarren, fast CSV-ähnlichen Format zu sein, z. NUTR_DEF.txt :

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

plus sr26_doc.pdf , die Dokumentation.

Tabellendefinitionen erstellen

Sie müssen hier also SQL-Tabellendefinitionen für die Datenbank erstellen – mit einer Tabelle für jede Eingabedatei. Sie benötigen die CREATE TABLE Befehl dafür; siehe die PostgreSQL-Dokumentation.

Seite 35 der PDF-Datei sollte Ihnen helfen - "Abbildung 1. Beziehungen zwischen Dateien in der USDA National Nutrient Database for Standard Reference". Die folgenden Seiten beschreiben die Dateiformate und sagen Ihnen, was jede Spalte bedeutet. Sie können CREATE TABLE schreiben Aussagen basierend auf dieser Beschreibung.

Hier ist ein Beispiel für FOOD_DES.txt (Lebensmittelbeschreibung), der erste Eintrag.

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

Das ist eine ziemlich wörtliche Kopie der Beschreibung. So würde ich die Tabelle nicht gestalten

Ich habe NUMERIC verwendet Dezimal-Gleitkommatypen mit beliebiger Genauigkeit für Genauigkeit bei nicht ganzzahligen numerischen Typen. Wenn Leistung wichtiger ist als Genauigkeit, können Sie float4 verwenden stattdessen.

Für Beziehungen verwenden Sie FOREIGN KEY Beschränkungen - nur colname coltype REFERENCES othertable(othercol) reicht aus, um eine zu erstellen.

Wichtig :Ich habe die Spaltennamen doppelt in Anführungszeichen gesetzt, um denselben Namen wie in den Definitionen beizubehalten. Das bedeutet, dass Sie sie immer doppelt anführen müssen, wenn Sie darauf verweisen, z. SELECT "NDB_No" FROM food_des; . Wenn Sie das nicht möchten, lassen Sie einfach die doppelten Anführungszeichen weg - oder wählen Sie andere Namen. Sie müssen sich nicht an die ungeschickten abgekürzten Spaltennamen halten, die sie verwendet haben, und es ist ganz vernünftig zu schreiben:

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

usw. Ebenso können Sie, wenn Sie mit Rails arbeiten, die Tabellendefinitionen so umwandeln, dass sie den Konventionen von Rails folgen, insbesondere wenn Sie beabsichtigen, das Laden der Daten über Rails durchzuführen.

Daten werden geladen

Wenn dies vernünftige, vernünftige Dateien mit Trennzeichen wären, könnten Sie einfach jede Tabelle mit psql laden Befehl \copy , oder die „Import“-Option von PgAdmin-III.

Es ist eigentlich CSV, sie haben sich gerade entschieden, völlig bizarre Trennzeichen und Anführungszeichen zu verwenden. Import über psql mit:

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

oder das Äquivalent in einem beliebigen Tool, das Sie verwenden, um mit PostgreSQL zu kommunizieren.

Das Ergebnis ist eine vernünftig aussehende Tabelle:

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)

In ähnlicher Weise können Sie bei Verwendung von Rails jede beliebige Rails-CSV-Bibliothek verwenden und in großen Mengen in Modelle laden.