sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo puedo importar datos de ASCII (ISO/IEC 8859-1) a mi base de datos Rails/PGSQL?

El zip contiene varios archivos:

  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         

cada uno de los cuales parece estar en un extraño formato casi similar a CSV, p. NUTR_DEF.txt :

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

más sr26_doc.pdf , la documentación.

Crear definiciones de tablas

Entonces, lo que debe hacer aquí es crear definiciones de tablas SQL para la base de datos, con una tabla para cada archivo de entrada. Necesitas CREATE TABLE comando para esto; consulte la documentación de PostgreSQL.

La página 35 del PDF debería ayudarlo:"Figura 1. Relaciones entre archivos en la Base de datos nacional de nutrientes para referencia estándar del USDA". Las siguientes páginas describen los formatos de archivo y le dicen qué significa cada columna. Puedes escribir CREATE TABLE declaraciones basadas en esta descripción.

Aquí hay un ejemplo, para FOOD_DES.txt (descripción del alimento), la primera entrada.

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

Esa es una copia bastante literal de la descripción. No es como yo diseñaría la mesa

He usado NUMERIC tipos de punto flotante decimal de precisión arbitraria para precisión en tipos numéricos no enteros. Si el rendimiento es más importante que la precisión, puede usar float4 en su lugar.

Para las relaciones, usa FOREIGN KEY restricciones:solo colname coltype REFERENCES othertable(othercol) es suficiente para crear uno.

Importante :comité dos veces los nombres de las columnas para conservar el mismo nombre que en las definiciones. Eso significa que siempre debe citarlos dos veces cuando se refiera a ellos, p. SELECT "NDB_No" FROM food_des; . Si no desea eso, simplemente omita las comillas dobles o elija nombres diferentes. No tienes que apegarte a los torpes nombres de columna abreviados que usaron, y es bastante razonable escribir:

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 manera similar, si está trabajando con Rails, puede convertir las definiciones de la tabla para seguir las convenciones de Rails, especialmente si tiene la intención de realizar la carga de datos a través de Rails.

Cargando datos

Si estos fueran archivos delimitados sensatos y sensatos, podría simplemente cargar cada tabla usando el psql comando \copy , o la opción "importar" de PgAdmin-III.

En realidad, es CSV, simplemente decidieron usar un delimitador y caracteres de comillas totalmente extraños. Importar a través de psql con:

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

o el equivalente en cualquier herramienta que uses para hablar con PostgreSQL.

Los resultados son una tabla de apariencia sensata:

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)

Del mismo modo, si usa Rails, puede usar la biblioteca CSV de Rails que desee y realizar una carga masiva en los modelos.