PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je importer des données depuis ASCII (ISO/IEC 8859-1) vers ma base de données Rails/PGSQL ?

Le zip contient un certain nombre de fichiers :

  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         

dont chacun semble être dans un format bizarre presque semblable à CSV, par ex. NUTR_DEF.txt :

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

plus sr26_doc.pdf , la documentation.

Créer des définitions de table

Donc, ce que vous devez faire ici est de créer des définitions de table SQL pour la base de données - avec une table pour chaque fichier d'entrée. Vous avez besoin de CREATE TABLE commande pour cela; voir la documentation PostgreSQL.

La page 35 du PDF devrait vous aider - "Figure 1. Relations entre les fichiers de la base de données nationale sur les nutriments de l'USDA pour référence standard". Les pages suivantes décrivent les formats de fichier, vous indiquant la signification de chaque colonne. Vous pouvez écrire CREATE TABLE déclarations basées sur cette description.

Voici un exemple, pour FOOD_DES.txt (description de l'aliment), la première entrée.

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

C'est une copie assez littérale de la description. Ce n'est pas comme ça que je concevrais la table

J'ai utilisé NUMERIC types décimaux à virgule flottante à précision arbitraire pour la précision des types numériques non entiers. Si les performances sont plus importantes que la précision, vous pouvez utiliser float4 à la place.

Pour les relations, vous utilisez FOREIGN KEY contraintes - juste colname coltype REFERENCES othertable(othercol) est suffisant pour en créer un.

Important :J'ai mis entre guillemets les noms de colonnes pour conserver le même nom que dans les définitions. Cela signifie que vous devez toujours les mettre entre guillemets lorsque vous y faites référence, par ex. SELECT "NDB_No" FROM food_des; . Si vous ne le souhaitez pas, supprimez simplement les guillemets - ou choisissez des noms différents. Vous n'êtes pas obligé de vous en tenir aux noms de colonnes abrégés maladroits qu'ils ont utilisés, et il est tout à fait raisonnable d'écrire :

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. De même, si vous travaillez avec Rails, vous pouvez convertir les définitions de table pour suivre les conventions de Rails, surtout si vous avez ensuite l'intention de charger les données via Rails.

Chargement des données

S'il s'agissait de fichiers délimités sains et sensés, vous pourriez alors simplement charger chaque table en utilisant le psql commande \copy , ou l'option "importer" de PgAdmin-III.

C'est en fait CSV, ils ont juste décidé d'utiliser des délimiteurs et des guillemets totalement bizarres. Importer via psql avec :

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

ou l'équivalent dans n'importe quel outil que vous utilisez pour parler à PostgreSQL.

Les résultats sont un tableau d'apparence raisonnable :

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)

De même, si vous utilisez Rails, vous pouvez utiliser la bibliothèque CSV Rails de votre choix et la charger en masse dans des modèles.