Überführung einer Word-Tabelle in eine MySQL Datenbank v2

7 10 2007

Vorgegeben war ein Word-Dokument, dessen Inhalte in eine MySQL Datenbank überführt werden sollten. Die Tabellenstruktur war (leider!) vorgegeben, so musste ich mich vor allem mit den Unwägbarkeiten eines für mich absolut nicht nachvollziehbaren Tabellenaufbau arrangieren.

Variante 1 (siehe weiter unten) hat sich doch als zu aufwändig erwiesen. Daher wird die Tabelle jetzt erst korrekt in Excel formatiert. Dann sollte das Einfügen in die Tabelle quasi automatisch ablaufen. Die Tabelle sieht im Aufbau also wie folgt aus (und zwar exakt so, damit die weiteren Schritte funktionieren):

Speichern der Tabelle im CSV Format. Die gespeicherte Datei anschließend mit UEStudio oder einem anderen Tools ins UTF8 Format konvertieren, damit Umlaute korrekt eingefügt werden können (natürlich ist es auch möglich, im phpMyAdmin einfach den korrekten Zeichensatz auszuwählen, war mir nur zu lästig das auszuprobieren…). Diese Schritte gleichen weitestgehend dem Beitrag weiter unten.

Erstellen einer temporären Tabelle in der Datenbank (einmalig).

CREATE TABLE temp (
	autor varchar(80) NOT NULL,
	stueck varchar(150) NOT NULL,
	thema1 varchar(150) DEFAULT NULL,
	thema2 varchar(150) DEFAULT NULL,
	thema3 varchar(150) DEFAULT NULL,
	stichwort1 varchar(90) DEFAULT NULL,
	stichwort2 varchar(90) DEFAULT NULL,
	stichwort3 varchar(90) DEFAULT NULL,
	stichwort4 varchar(90) DEFAULT NULL,
	`alter` varchar(80) DEFAULT NULL,
	ort varchar(80) DEFAULT NULL,
	link varchar(120) DEFAULT NULL
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

Einfügen der mit Excel exportierten CSV Daten über phpMyAdmin. Dazu die Tabelle „temp“ auswählen und bei „Importieren“ die Datei angeben und als Dateiformat CSV selektieren.

Folgende SQL Statements ausführen:

-- Tabelle "angebot" füllen
INSERT INTO angebot SELECT NULL, autor, stueck, ort, link, `alter` FROM temp;

-- Tabelle "stichwort" füllen
CREATE TEMPORARY TABLE temp_stichwort(stichwort varchar(90) DEFAULT NULL) ENGINE=MyISAM;
INSERT INTO temp_stichwort SELECT stichwort1 FROM temp;
INSERT INTO temp_stichwort SELECT stichwort2 FROM temp;
INSERT INTO temp_stichwort SELECT stichwort3 FROM temp;
INSERT INTO temp_stichwort SELECT stichwort4 FROM temp;
INSERT INTO stichwort SELECT NULL, stichwort FROM temp_stichwort WHERE stichwort != '' GROUP BY stichwort ORDER BY stichwort ASC;
DROP TABLE temp_stichwort;

-- Tabelle "themenfeld" füllen
CREATE TEMPORARY TABLE temp_themenfeld(thema varchar(150) DEFAULT NULL) ENGINE=MyISAM;
INSERT INTO temp_themenfeld SELECT thema1 FROM temp;
INSERT INTO temp_themenfeld SELECT thema2 FROM temp;
INSERT INTO temp_themenfeld SELECT thema3 FROM temp;
INSERT INTO themenfeld SELECT NULL, thema FROM temp_themenfeld WHERE thema != '' GROUP BY thema ORDER BY thema ASC;
DROP TABLE temp_themenfeld;

-- Tabelle "zusammen" füllen
INSERT INTO zusammen SELECT angebot.ID, stichwort.IDSTW, '1' FROM angebot, temp, stichwort WHERE temp.stichwort1 != '' AND angebot.autor = temp.autor  AND angebot.stueck = temp.stueck AND temp.stichwort1 = stichwort.Stichwort ORDER BY angebot.ID ASC;
INSERT INTO zusammen SELECT angebot.ID, stichwort.IDSTW, '2' FROM angebot, temp, stichwort WHERE temp.stichwort2 != '' AND angebot.autor = temp.autor  AND angebot.stueck = temp.stueck AND temp.stichwort2 = stichwort.Stichwort ORDER BY angebot.ID ASC;
INSERT INTO zusammen SELECT angebot.ID, stichwort.IDSTW, '3' FROM angebot, temp, stichwort WHERE temp.stichwort3 != '' AND angebot.autor = temp.autor  AND angebot.stueck = temp.stueck AND temp.stichwort3 = stichwort.Stichwort ORDER BY angebot.ID ASC;
INSERT INTO zusammen SELECT angebot.ID, stichwort.IDSTW, '4' FROM angebot, temp, stichwort WHERE temp.stichwort4 != '' AND angebot.autor = temp.autor  AND angebot.stueck = temp.stueck AND temp.stichwort4 = stichwort.Stichwort ORDER BY angebot.ID ASC;

-- Tabelle "zusammenth" füllen
INSERT INTO zusammenth SELECT angebot.ID, themenfeld.IDTHE, '1' FROM angebot, temp, themenfeld WHERE temp.thema1 != '' AND angebot.autor = temp.autor  AND angebot.stueck = temp.stueck AND temp.thema1 = themenfeld.Thema ORDER BY angebot.ID ASC;
INSERT INTO zusammenth SELECT angebot.ID, themenfeld.IDTHE, '2' FROM angebot, temp, themenfeld WHERE temp.thema2 != '' AND angebot.autor = temp.autor  AND angebot.stueck = temp.stueck AND temp.thema2 = themenfeld.Thema ORDER BY angebot.ID ASC;
INSERT INTO zusammenth SELECT angebot.ID, themenfeld.IDTHE, '3' FROM angebot, temp, themenfeld WHERE temp.thema3 != '' AND angebot.autor = temp.autor  AND angebot.stueck = temp.stueck AND temp.thema3 = themenfeld.Thema ORDER BY angebot.ID ASC;

-- Tabelle "temp" leeren
TRUNCATE TABLE temp;

Jetzt können die Daten abgefragt werden um zu prüfen, ob alles korrekt lief. Das SELECT-Statement ist nicht ganz trivial, ich greife auf die Funktion group_concat zurück, um die Stichworte bzw. Themenfelder für die Darstellung in einem Feld zusammenzufügen. Die ganze Sache hätte man sicherlich einfacher halten können, da die maximale Anzahl der Stichworte / Themenfelder fix und durchaus überschaubar ist. Aber die Tabellenstruktur war wie bereits angesprochen leider vorgegeben… Crazy Smilie

Die Themenfelder abfragen:

SELECT
	angebot.Autor,
	angebot.Stueck,
	GROUP_CONCAT(themenfeld.Thema) Thema
FROM angebot
JOIN themenfeld
JOIN zusammenth ON angebot.ID = zusammenth.ID AND themenfeld.IDTHE = zusammenth.IDTHE
GROUP BY angebot.ID
ORDER BY angebot.Autor ASC, angebot.Stueck ASC
LIMIT 0,5;
+---------------------------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+
| Autor                     | Stueck                            | Thema                                                                                                     |
+---------------------------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+
| Aischylos                 | Die Orestie                       | Recht und Gerechtigkeit,Schuld und Sühne                                                                  |
| Albee, Edward             | Wer hat Angst vor Virginia Woolf? | Schuld und Sühne,Selbst- und Fremdbestimmung,Sinn und Sinnverlust                                         |
| Alfano, Franco            | Cyrano de Bergerac (Oper)         | Recht und Gerechtigkeit,Gelingen und Scheitern: Liebesgeschichten,Wirklichkeit und Phantasie: Gegenwelten |
| Alfieri, Richard          | Sechs Tanzstunden in sechs Wochen | Wirklichkeit und Phantasie: Gegenwelten                                                                   |
| Andersen, Hans Christian  | Die Schneekönigin                 | Ohne                                                                                                      |
+---------------------------+-----------------------------------+-----------------------------------------------------------------------------------------------------------+
5 rows in set (0.09 sec)

Die Stichworte abfragen:

SELECT
	angebot.Autor,
	angebot.Stueck,
	GROUP_CONCAT(stichwort.Stichwort) Stichwort
FROM angebot
JOIN stichwort
JOIN zusammen ON angebot.ID = zusammen.ID AND stichwort.IDSTW = zusammen.IDSTW
GROUP BY angebot.ID
ORDER BY angebot.Autor ASC, angebot.Stueck ASC
LIMIT 0,5;
+---------------------------+-----------------------------------+--------------------------------------------------+
| Autor                     | Stueck                            | Stichwort                                        |
+---------------------------+-----------------------------------+--------------------------------------------------+
| Aischylos                 | Die Orestie                       | Recht und Gerechtigkeit,Rache,Griech. Mythologie |
| Albee, Edward             | Wer hat Angst vor Virginia Woolf? | Lebenslügen,Sehnsucht,Beziehungen                |
| Alfano, Franco            | Cyrano de Bergerac (Oper)         | Wahrheit,Verkleidung,Liebe                       |
| Andersen, Hans Christian  | Die Schneekönigin                 | Mut,Freundschaft,Märchen                         |
| Aperghis, George          | Rotkäppchen (Oper)                | Märchen                                          |
+---------------------------+-----------------------------------+--------------------------------------------------+
5 rows in set (0.59 sec)
Advertisements

Aktionen

Information

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s




%d Bloggern gefällt das: