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テーブル定義を作成することです。入力ファイルごとに1つのテーブルを使用します。 CREATE TABLEが必要です このためのコマンド; PostgreSQLのドキュメントを参照してください。

    PDFの35ページが役立つはずです-「図1.標準参照用のUSDANationalNutrientDatabase内のファイル間の関係」。次のページでは、ファイル形式について説明し、各列の意味を説明します。 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を使用しました 非整数型の精度のための任意精度の10進浮動小数点型。精度よりもパフォーマンスが重要な場合は、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. Dockerで実行されているPostgreSQLデータベースに対して実行されたParallelGoテスト

    2. MySQLが停止した場合の手順

    3. サブクエリを使用せずに最大シーケンスの行のみを選択する方法は?

    4. MySQL動的ピボットテーブル