PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как мога да импортирам данни от ASCII (ISO/IEC 8859-1) в моята база данни Rails/PGSQL?

ZIP кодът съдържа няколко файла:

  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         

всеки от които изглежда е в странен почти CSV формат, напр. NUTR_DEF.txt :

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

плюс sr26_doc.pdf , документацията.

Създаване на дефиниции на таблици

Така че това, което трябва да направите тук, е да създадете дефиниции на SQL таблици за базата данни - с една таблица за всеки входен файл. Нуждаете се от CREATE TABLE команда за това; вижте документацията на PostgreSQL.

Страница 35 от PDF трябва да ви помогне - "Фигура 1. Връзки между файловете в Националната база данни за хранителни вещества на USDA за стандартна справка". Следващите страници описват файловите формати, като ви казват какво означава всяка колона. Можете да напишете CREATE TABLE твърдения, базирани на това описание.

Ето един пример за FOOD_DES.txt (описание на храната), първият запис.

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

Това е доста буквално копие на описанието. Не е начинът, по който бих проектирал масата

Използвах NUMERIC десетични типове с плаваща запетая с произволна точност за точност при нецелочислени типове. Ако производителността е по-важна от точността, можете да използвате float4 вместо това.

За връзки използвате FOREIGN KEY ограничения - просто colname coltype REFERENCES othertable(othercol) е достатъчно, за да създадете такъв.

Важно :Цитирах два пъти имената на колоните, за да запазя същото име като в дефинициите. Това означава, че винаги трябва да ги цитирате, когато ги позовавате, напр. SELECT "NDB_No" FROM food_des; . Ако не искате това, просто пропуснете двойните кавички - или изберете различни имена. Не е нужно да се придържате към тромавите съкратени имена на колони, които са използвали, и е съвсем разумно да напишете:

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

и т.н. По същия начин, ако работите с Rails, можете да конвертирате дефинициите на таблицата, за да следвате конвенциите на Rails, особено ако след това възнамерявате да извършите зареждането на данни чрез Rails.

Данните се зареждат

Ако това бяха разумни, разумни файлове с разделители, тогава бихте могли просто да заредите всяка таблица с помощта на psql команда \copy , или опцията "импорт" на PgAdmin-III.

Всъщност това е CSV, те просто са решили да използват напълно странни символи за разделители и кавички. Импортирайте чрез psql с:

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

или еквивалента във всеки инструмент, който използвате, за да говорите с PostgreSQL.

Резултатите са разумно изглеждаща таблица:

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)

По същия начин, ако използвате Rails, можете да използвате каквато желаете Rails CSV библиотека и да зареждате групово в модели.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мигриране на съществуващи данни за auth.User към нов потребителски модел на Django 1.5?

  2. Променете от SQLite към PostgreSQL в нов проект на Rails

  3. Как Postgresql COPY TO STDIN с CSV се актуализира при конфликт?

  4. postgresql връща 0, ако върнатата стойност е нула

  5. Собственикът на базата данни на postgresql няма достъп до базата данни - Няма намерени връзки.