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. 用波浪号再次拆分每个标记,将第一部分放入一个字段中,将第二部分放入同一记录中的单独字段中(我不关心通过管道拆分)

我不知道这是否可能,但我希望它是。我也希望只需要这样做一次,因为新系统会自动创建所有这些废话。我的 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 回答