0

古いデータセットを新しく構造化されたデータベースに変換しています。現在、次の形式のデータがあります。

[quantity int]~[var1 string]|[var2 string optional]|[var3 string optional];(etc);
[quantity]~[var1]|[var2]|[var3]

ここで、さまざまなパターンは、最初にセミコロン、次にチルダ、最後に既存のデータベース内の同じフィールド(角かっこなし)内のパイプ文字で区切られます。例えば:

3~S|Red|Top;1~S|Blue|Top; ... etc ... ;20~XL|Green|Left

各レコードでその文字列を取得し、次のことを実行します。

  1. 各セミコロン分割に基づいて、既存のテーブルに新しいレコードを作成します
  2. 同じレコードの最初のピースを1つのフィールドに入れ、2番目のピースを別のフィールドに入れて(パイプで分割する必要はありません)、各トークンをチルダで再度分割します

それが可能かどうかはわかりませんが、可能であることを願っています。また、新しいシステムがこのすべてのがらくたを自動的に作成するので、これを1回だけ実行する必要があることを望んでいます。私のsproc-fuはMySQLでかなりひどいので、どんな助けでも大歓迎です。

本当にありがとう!

4

2 に答える 2

1

SQL でこれを行うのはかなり大雑把に思えますが、概念実証のスクリプトを次に示します。

出力が正しいと思われる場合は、SELECT を適切な INSERT ステートメントに置き換えると、必要なものが得られるはずです。

delimiter ;;

drop procedure if exists load_crazy_stuff;;

create procedure load_crazy_stuff(in s longtext)
begin
   declare pos       int;
   declare record    longtext;
   declare leftpart  int;
   declare rightpart longtext;
   set s = concat(s,';');
   while length(s)>0 DO
     set pos       = instr(s,';');
     set record    = left(s,pos-1);
     set s         = substr(s,pos+1);
     set pos       = instr(record,'~');
     set leftpart  = left(record,pos-1);
     set rightpart = substr(record,pos+1);
     select leftpart, rightpart;
   end while;
end;;

call load_crazy_stuff('3~S|Red|Top;1~S|Blue|Top;20~XL|Green|Left');;
于 2010-12-18T01:40:03.963 に答える
1

それを行うための非総体的な方法は次のとおりです。

load data infile '/tmp/your-data-file' into table yourtable fields terminated by '~' lines terminated by ';';
于 2010-12-18T01:48:41.253 に答える