テーブル名が最初の列でフィールドが2番目の列であるファイルからSQLスクリプトを作成します。

テーブル名が最初の列でフィールドが2番目の列であるファイルからSQLスクリプトを作成します。

スペースで区切られた2つの列を含むテキストファイルがあります。

Foo Param1
Foo Param2
Foo Param3
Foo Param4
Foo Param5
Bar Stuff1
Bar Stuff2
Bar Param3
Bar Stuff4
etc

最初の列はグループ名で、2番目の列はそのグループ内の一意の属性です(属性名は2つの異なるグループに表示できますが、これは正常です)。

このファイルから次のSQLファイルを作成できることを願っています。

CREATE TABLE "Foo" (
   id SERIAL PRIMARY KEY,
   Param1 text,
   Param2 text,
   Param3 text,
   Param4 text,
   Param5 text
);
CREATE TABLE "Bar" (
   id SERIAL PRIMARY KEY,
   Stuff1 text,
   Stuff2 text,
   Param3 text,
   Stuff4 text
);

テーブル名はファイルの最初の列から取得され、2番目の列は作成するフィールドとして使用されます。

今まで試したことはこれスレッドは次のとおりです。

awk -F ' ' 'BEGIN{IFS=","}NR>1{arr[$1]++}END{for (a in arr) print "CREATE TABLE IF NOT EXISTS " a " (" ${arr[*]} " )"}' file.txt

しかし、これは明らかに動作しません。

bash / Ubuntu 22.04でこれを達成する簡単な方法はありますか?


背景用:以下を使用して画像メタデータを抽出しました。exiftool一つ食べてあげたいPostgreSQL各データベースには1つのテーブルがあります。グループレベル0では、すべてのタグが属性として見つかります。

したがって、テキストファイルの最初の列はEXIFXMPまたはのようなグループ名に対応しICC_ProfileEXIFグループの場合、2番目の列にはなどArtistの値があります。ColorSpaceFNumber

ベストアンサー1

しないでください。これは非常に悪いデザインパターンです。ソースデータファイルに新しい「グループ値」ペアが含まれているか欠落している場合は、そのグループのテーブルを再作成しますか?グループはいくつありますか?これが小さな定数であることは確実ですか?テーブル名をどのようにパラメータ化する予定ですか?

すでに持っているデータに従うテーブルを作成するだけです。

create table data (
   group text,
   flag text,
   comment text,
   primary key(group, flag)
);

EAVデータベーススキーマを理解します。https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

おすすめ記事