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

3 10 2007

Die Problemstellung war, eine Word-Tabelle in eine MySQL Datenbank zu überführen. Nun könnte man alle Daten per Hand in die Datenbank eintippen, was aber einiges an Aufwand bedeutet hätte. Also musste eine möglichst automatisierte Lösung her. Zuerst wurde die Tabelle in Excel per Copy & Paste übertragen, was tatsächlich auch ganz gut funktionierte. Ich habe hier nur OpenOffice Calc zur Verfügung, die weitere Verarbeitung also damit. Das Ergebnis sah so aus:

Diese Daten sollten jetzt in diese Tabellenstruktur. Diese war fest so vorgegeben, hier also leider kein Spielraum die Struktur an die Daten anzupassen.

mysql> describe Angebot;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| ID     | int(3)       | NO   | PRI | NULL    | auto_increment |
| Autor  | varchar(80)  | NO   |     |         |                |
| Stueck | varchar(150) | NO   |     |         |                |
| Ort    | varchar(80)  | NO   |     |         |                |
| Link   | varchar(120) | NO   |     |         |                |
| Alter  | varchar(80)  | NO   |     |         |                |
+--------+--------------+------+-----+---------+----------------+

mysql> describe Stichwort;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| IDSTW     | int(3)      | NO   | PRI | NULL    | auto_increment |
| Stichwort | varchar(90) | NO   |     |         |                |
+-----------+-------------+------+-----+---------+----------------+

mysql> describe Themenfeld;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| IDTHE | int(3)       | NO   | PRI | NULL    | auto_increment |
| Thema | varchar(150) | NO   |     |         |                |
+-------+--------------+------+-----+---------+----------------+

mysql> describe zusammen;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| ID    | varchar(3) | NO   |     |         |       |
| IDSTW | varchar(4) | NO   |     |         |       |
| NR    | varchar(4) | NO   |     |         |       |
+-------+------------+------+-----+---------+-------+

mysql> describe zusammenth;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| ID    | varchar(3) | NO   |     |         |       |
| IDTHE | varchar(4) | NO   |     |         |       |
| NRTH  | varchar(4) | NO   |     |         |       |
+-------+------------+------+-----+---------+-------+

Los ging es mit den Tabellen „Angebot“, „Stichwort“ und „Themenfeld“. Hierzu fügte ich neue Tabellen in Calc ein und kopierte jeweils die Struktur in die Tabellen, wie von der Datenbank vorgegeben.

Diese Seiten werden jetzt einzeln als CSV exportiert. Als Feldbegrenzer habe ich das Semikolon (;) gewählt.

Die weitere Bearbeitung erfolgte mit dem Texteditor UEStudio ’06. Hier habe ich die CSV Dateien geladen und sortiert. Dabei auch gleich noch alle doppelten Zeilen gelöscht, was besonders bei den Stichworten und Themenfeldern einiges ausmachte. In der Datenbank benötige ich keine Redundanzen und die Sortierung macht die Sache noch etwas übersichtlicher.

So sah die Datei vorher aus:

Jetzt wird sortiert:

Und das Ergebnis:

Diese Daten können so per phpMyAdmin in die Datenbank importiert werden.

mysql> select * from Angebot order by id asc limit 0,3;
+----+----------------+-----------------------------------+-----+------+-------+
| ID | Autor          | Stueck                            | Ort | Link | Alter |
+----+----------------+-----------------------------------+-----+------+-------+
|  1 | Albee, Edward  | Wer hat Angst vor Virginia Woolf? | MA  |      | Ab 12 |
|  2 | Aischylos      | Die Orestie                       | KA  |      | Ab 12 |
|  3 | Alfano, Franco | Cyrano de Bergerac (Oper)         | KA  |      | Ab 12 |
+----+----------------+-----------------------------------+-----+------+-------+

Schwieriger sollte es bei den Verknüpfungstabellen „zusammen“‚ und „zusammenth“‚ werden. Hier mussten erst zwei neue Calc Tabellen erstellt werden… (Alles weitere sind bisher nur Vorüberlegungen)

Erstellen einer Hilfstabelle „temp“:

CREATE TABLE `temp` (
	`id` INT NOT NULL ,
	`Autor` VARCHAR( 255 ) NOT NULL ,
	`Stueck` VARCHAR( 255 ) NOT NULL ,
	`f1` VARCHAR( 255 ) NULL ,
	`f2` VARCHAR( 255 ) NULL ,
	`f3` VARCHAR( 255 ) NULL ,
	`f4` VARCHAR( 255 ) NULL
) ENGINE = MYISAM ;
mysql> describe temp;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| id     | int(11)      | NO   |     |         |       |
| Autor  | varchar(255) | NO   |     |         |       |
| Stueck | varchar(255) | NO   |     |         |       |
| f1     | varchar(255) | YES  |     | NULL    |       |
| f2     | varchar(255) | YES  |     | NULL    |       |
| f3     | varchar(255) | YES  |     | NULL    |       |
| f4     | varchar(255) | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+

Die Themen umwandeln in die IDs der Tabelle „themenfeld“. Dies ist mit allen Feldern (fn) durchzuführen.

UPDATE temp, themenfeld
SET temp.f1 = themenfeld.IDTHE
WHERE temp.f1 = themenfeld.Thema;

Die ID des Stücks aus der Tabelle „angebot'“ holen.

UPDATE temp, angebot
SET temp.id = angebot.ID
WHERE temp.Autor = angebot.Autor
AND temp.Stueck = angebot.Stueck;

Die Tabelle zusammenth wird jetzt mit den Werten aus dieser temporären Tabelle gefüllt

INSERT INTO zusammenth
SELECT id, f1, '1'
FROM temp;

INSERT INTO zusammenth
SELECT id, f2, '2'
FROM temp
WHERE f2 != '';

INSERT INTO zusammenth
SELECT id, f3, '3'
FROM temp
WHERE f3 != '';

ALTER TABLE zusammenth ORDER BY ID ASC, NRTH ASC;

Abschließend noch die gesammelten Update Statements:

-- ***** Stichwort *****

-- Daten laden
LOAD DATA LOCAL INFILE '[CVS-Datei]' REPLACE INTO TABLE `temp` FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n';

-- Feldbezeichnung ersetzen durch die ID
UPDATE temp, Stichwort SET temp.f1 = Stichwort.IDSTW WHERE temp.f1 = Stichwort.Stichwort;
UPDATE temp, Stichwort SET temp.f2 = Stichwort.IDSTW WHERE temp.f2 = Stichwort.Stichwort;
UPDATE temp, Stichwort SET temp.f3 = Stichwort.IDSTW WHERE temp.f3 = Stichwort.Stichwort;
UPDATE temp, Stichwort SET temp.f4 = Stichwort.IDSTW WHERE temp.f4 = Stichwort.Stichwort;

-- ID ersetzen
UPDATE temp, Angebot SET temp.id = Angebot.ID WHERE temp.Autor = Angebot.Autor AND temp.Stueck = Angebot.Stueck;

-- Einfügen
INSERT INTO zusammen SELECT id, f1, '1' FROM temp WHERE f1 != '';
INSERT INTO zusammen SELECT id, f2, '2' FROM temp WHERE f2 != '';
INSERT INTO zusammen SELECT id, f3, '3' FROM temp WHERE f3 != '';
INSERT INTO zusammen SELECT id, f4, '4' FROM temp WHERE f4 != '';

-- Leeren der Temp-Tabelle (nur zur Sicherheit)
TRUNCATE TABLE temp;


-- ***** Themenfeld *****

-- Daten laden
LOAD DATA LOCAL INFILE '[CVS-Datei]' REPLACE INTO TABLE `temp` FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n';

-- Feldbezeichnung ersetzen durch die ID
UPDATE temp, Themenfeld SET temp.f1 = Themenfeld.IDTHE WHERE temp.f1 = Themenfeld.Thema;
UPDATE temp, Themenfeld SET temp.f2 = Themenfeld.IDTHE WHERE temp.f2 = Themenfeld.Thema;
UPDATE temp, Themenfeld SET temp.f3 = Themenfeld.IDTHE WHERE temp.f3 = Themenfeld.Thema;

-- ID ersetzen
UPDATE temp, Angebot SET temp.id = Angebot.ID WHERE temp.Autor = Angebot.Autor AND temp.Stueck = Angebot.Stueck;


-- Einfügen
INSERT INTO zusammenth SELECT id, f1, '1' FROM temp WHERE f1 != '';
INSERT INTO zusammenth SELECT id, f2, '2' FROM temp WHERE f2 !='';
INSERT INTO zusammenth SELECT id, f3, '3' FROM temp WHERE f3 !='';
Advertisements

Aktionen

Information

One response

12 04 2008
aaaaaprvdgrwwelt ihr Blog » Überführung einer Word-Tabelle in eine MySQL Datenbank v2

[…] Variante 1 (siehe weiter unten) hat sich doch als zu aufwändig erwiesen. Daher wird die Word-Tabelle jetzt erst korrekt formatiert. Dann sollte das Einfügen in die Tabelle quasi automatisch ablaufen. […]

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: