Frage

Ich bin Umwandlung einen alten Datensatz in eine neu strukturierten Datenbank. Derzeit haben sie Daten in diesem Format:

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

wo verschiedene Muster abgegrenzt werden zuerst durch Semikolons, dann von Tilden, und schließlich durch Rohr Zeichen innerhalb des gleichen Feldes (keine Klammern) in der vorhandenen Datenbank. Zum Beispiel:

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

Ich möchte in jedem Datensatz die Zeichenfolge nehmen und Folgendes tun:

  1. Erstellen Sie einen neuen Datensatz in einer vorhandenen Tabelle basiert weg von jedem Semikolon Split
  2. Split jeweils wieder Token durch die Tilde, das erste Stück in ein Feld und das zweite in einem separaten Feld setzen (ich kümmere mich nicht um Spaltung durch Rohr) in demselben Datensatz

Ich weiß nicht, ob es überhaupt möglich ist, aber ich hoffe, dass es ist. Ich hoffe, auch nur einmal angewählt haben, wie das neue System dafür sorgt, wird alle diesen Mist automatisch zu schaffen. Mein sproc-fu ist ziemlich schrecklich in MySQL, so dass jede Hilfe wird sehr geschätzt.

Vielen Dank!

War es hilfreich?

Lösung

Dies scheint ein ziemlich grob, was in SQL zu tun, aber hier ist ein Proof-of-Concept-Skript.

Wenn die Ausgabe aussieht Recht auf Dich, die SELECT mit einer entsprechenden Anweisung INSERT ersetzen und es sollten Sie bekommen, was Sie wollen.

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

Andere Tipps

Die nicht-Brutto Art und Weise, es zu tun, ist dies:

load data infile '/tmp/your-data-file' into table yourtable fields terminated by '~' lines terminated by ';';
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top