Zip chứa một số tệp:
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
mỗi trong số đó dường như có định dạng kỳ lạ gần giống CSV, ví dụ:NUTR_DEF.txt
:
~287~^~g~^~GALS~^~Galactose~^~2~^~2100~
~291~^~g~^~FIBTG~^~Fiber, total dietary~^~1~^~1200~
cộng với sr26_doc.pdf
, tài liệu.
Tạo định nghĩa bảng
Vì vậy, những gì bạn cần làm ở đây là tạo các định nghĩa bảng SQL cho cơ sở dữ liệu - với một bảng cho mỗi tệp đầu vào. Bạn cần CREATE TABLE
lệnh cho điều này; xem tài liệu PostgreSQL.
Trang 35 của PDF sẽ giúp bạn - "Hình 1. Mối quan hệ giữa các tệp trong Cơ sở dữ liệu dinh dưỡng quốc gia USDA để tham khảo tiêu chuẩn". Các trang sau mô tả các định dạng tệp, cho bạn biết ý nghĩa của mỗi cột. Bạn có thể viết CREATE TABLE
báo cáo dựa trên mô tả này.
Đây là một ví dụ, cho FOOD_DES.txt
(mô tả món ăn), mục nhập đầu tiên.
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)
);
Đó là một bản sao mô tả khá theo nghĩa đen. Đó không phải là cách tôi thiết kế bảng
Tôi đã sử dụng NUMERIC
các kiểu dấu phẩy động thập phân có độ chính xác tùy ý cho độ chính xác ở các kiểu số không phải số nguyên. Nếu hiệu suất quan trọng hơn độ chính xác, bạn có thể sử dụng float4
thay vào đó.
Đối với các mối quan hệ, bạn sử dụng FOREIGN KEY
ràng buộc - chỉ colname coltype REFERENCES othertable(othercol)
là đủ để tạo một.
Quan trọng :Tôi đã trích dẫn kép tên cột để giữ nguyên tên giống như trong định nghĩa. Điều đó có nghĩa là bạn phải luôn trích dẫn kép chúng khi bạn đề cập đến chúng, ví dụ:SELECT "NDB_No" FROM food_des;
. Nếu bạn không muốn điều đó, chỉ cần bỏ dấu ngoặc kép - hoặc chọn các tên khác. Bạn không cần phải tuân theo những tên cột viết tắt vụng về mà họ đã sử dụng, và khá hợp lý khi viết:
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),
v.v. Tương tự, nếu bạn đang làm việc với Rails, bạn có thể chuyển đổi các định nghĩa bảng để tuân theo các quy ước của Rails, đặc biệt nếu sau đó bạn có ý định tải dữ liệu qua Rails.
Đang tải dữ liệu
Nếu đây là các tệp được phân tách hợp lý, lành mạnh, bạn có thể tải từng bảng bằng cách sử dụng psql
lệnh \copy
hoặc tùy chọn "nhập" của PgAdmin-III.
Nó thực sự là CSV, họ vừa quyết định sử dụng dấu phân cách và ký tự trích dẫn hoàn toàn kỳ lạ. Nhập qua psql
với:
\copy food_des FROM 'FOOD_DES.txt' (FORMAT CSV, DELIMITER '^', QUOTE '~');
hoặc tương đương trong bất kỳ công cụ nào bạn sử dụng để nói chuyện với PostgreSQL.
Kết quả là một bảng dễ nhìn:
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)
Tương tự, nếu sử dụng Rails, bạn có thể sử dụng bất kỳ thư viện Rails CSV nào bạn muốn và tải hàng loạt vào các mô hình.