Pregunta

Estoy convirtiendo un viejo conjunto de datos en una base de datos nueva estructura. Actualmente tienen datos en este formato:

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

donde varios patrones están delimitados primero por punto y coma, y ??luego por tildes, y finalmente por caracteres de tubería dentro del mismo campo (sin paréntesis angulares) dentro de la base de datos existente. Por ejemplo:

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

quiero tomar esa cadena en cada registro y hacer lo siguiente:

  1. Crea un nuevo registro en una tabla existente con sede fuera de cada fracción de punto y coma
  2. Dividir cada ficha de nuevo por la tilde, poniendo la primera pieza en un campo y el segundo en un campo separado (no me importa acerca de la división por tubería) en el mismo registro

No sé si es aún posible, pero espero que lo es. También espero sólo para tener que hacer esto una vez, ya que el nuevo sistema se hará cargo de la creación de toda esta basura de forma automática. Mi sproc-fu es bastante horrible en MySQL, por lo que cualquier ayuda es muy apreciada.

Muchas gracias!

¿Fue útil?

Solución

Esto parece una cosa bastante bruto que hacer en SQL, pero aquí hay un script de prueba de concepto.

Si las miradas de salida a la derecha que, reemplazan el SELECT con una instrucción INSERT apropiada y debe conseguir lo que desea.

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');;

Otros consejos

La forma bruta no hacerlo es la siguiente:

load data infile '/tmp/your-data-file' into table yourtable fields terminated by '~' lines terminated by ';';
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top