Inhalt aus Textdatei in MySQL Datenbank 'einsortieren'

NoahsRaven

Benutzer
Beiträge
7
Hallo,

ich stehe vor folgender Herausforderung:
Ich habe eine txt/csv-datei mit der Struktur [ID] [Status]
weiterhin habe ich die darin stehenden E-Mail-Adressen in einer MySQL-Datenbank mit der Struktur
[ID] [Vorname] [Name] . . .
Die Kombination [ID] - [Email] ist in Datenbank und Datei immer die gleiche aber nicht jede E-Mail-Adresse aus der DB steht auch in der Txt-Datei
Ich möchte nun den [Status] der E-Mail-Adressen A,B,C . . . dort in die Tabellenzeile der DB importieren wo dort auch die Adressen A,B,C . . . steht.
Eine Textdatei pauschal importieren ist ja kein problem.
aber wie mache ich das einsortieren?

MFG Stefan
 
Werbung:
nicht ganz klar, was dein Problem ist, klingt aber so, als ob dich das Thema joinen zweier Tabellen interessieren könnte.
Ne nicht ganz das eine ist ja ne CSV und die E-Mail-adressen sind darin im wesentlichen die selben wie in der Datenbank und jetzt will ich zu diesen E-MailAdressen in der DB eine Info dazu geben die in der CSV steht
 
Ich habe eine txt/csv-datei mit der Struktur [ID] [Status]
weiterhin habe ich die darin stehenden E-Mail-Adressen in einer MySQL-Datenbank mit der Struktur
[ID] [Vorname] [Name] . . .
Die Kombination [ID] - ist in Datenbank und Datei immer die gleiche aber nicht jede E-Mail-Adresse aus der DB steht auch in der Txt-Datei

Das ist alles unklar:

  • ein Feld email-Adresse gibt es weder in der csv noch in der Tabelle
  • eine Kombination ID und eMail gibt es somit auch nirgends
  • was für ein Status einer eMail-Adresse?

Das ist alles nicht nachvollziehbar...

Ich hab hier eine CSV-Datei:

Code:
id, status
1, true
2, true
3, false
5, false

und in der DB:

Code:
edb=# create table mail (id int primary key, vorname text, nachname text);
CREATE TABLE
edb=# insert into mail values (1, 'Max','Mustermann');
INSERT 0 1
edb=# insert into mail values (2, 'Susi','Sorglos');
INSERT 0 1
edb=# insert into mail values (4,'Willi','Wichtig');
INSERT 0 1
edb=# CREATE EXTENSION file_fdw;
CREATE EXTENSION
edb=# CREATE SERVER maildata FOREIGN DATA WRAPPER file_fdw;
CREATE SERVER
edb=# CREATE FOREIGN TABLE mail_csv (id int, status bool) server maildata options (filename '/tmp/email.csv', format 'csv', header 'true');
CREATE FOREIGN TABLE
edb=# select * from mail_csv;
 id | status
----+--------
  1 | t
  2 | t
  3 | f
  5 | f
(4 Zeilen)

edb=# select * from mail_csv left join mail on (mail_csv.id = mail.id);
 id | status | id | vorname |  nachname 
----+--------+----+---------+------------
  1 | t      |  1 | Max     | Mustermann
  2 | t      |  2 | Susi    | Sorglos
  3 | f      |    |         |
  5 | f      |    |         |
(4 Zeilen)

Ich nutze also einen FOREIGN DATA WRAPPER um aus der DB die CSV-Datei als Tabelle ansprechen zu können, habe eine reguläre Tabelle in der DB und nutze einen JOIN, um diese beiden Tabellen zu verbinden.

Ds ist, kurz demonstriert, das was Du suchst, vermute ich.


Vielleicht versuchst Du einfach mal klar und verständlich zu formulieren, was Du hast und was Du willst.[/QUOTE]
 
Aaah ok, jetzt habe ich verstanden woher das Missverständnis kommt
Sorry mein Fehler, nicht Felder sondern Spalten,
Also ich habe in der CSV Tabelle drei Spalten namens "ID" "Email" "Status"
und in der DB-Tabelle habe ich die Spalten namens "ID" "Email" "Vorname" "Name" . . . "Status"
Die E-Mail-Adressen A,B,C . . . haben in der DB-Tabelle dieselbe [ID] wie in der CSV-Datei.
CSV-Datei:
Code:
 ID |   Email    | status|
----+------------+-------+---------+------------
  1 | aaa@bbb.de |  leer |
  2 | bbb@bbb.de |  voll |
  4 | ddd@bbb.de |  n.e. |
  5
DB-Tabelle:
Code:
ID  |    Email   | Vorname | Name | . . . | status |
----+------------+---------+------+-------+--------+
  1 | aaa@bbb.de |   aaa   |  bbb | . . . |  ???   |
  2 | bbb@bbb.de |   bbb   |  bbb | . . . |  ???   |
  3 | ccc@bbb.de |   ccc   |  bbb | . . . |  voll  |
  4 | ddd@bbb.de |   ddd   |  bbb | . . . |  ???   |
  5
Wie bekomme ich den "Status" der jeweiligen E-Mail-Adresse aus der CSV in die richtige Zeile der DB-Tabelle?
MFG Stefan

PS: jetzt weis ich auch was bei meinen ersten Beitrag schief lief:
er hat ['Email] als BB-Code erkannt, deswegen waren diese Felder/Spalten in meiner Erklärung nicht zu sehen.
böses Faul
 
Zuletzt bearbeitet:
nun ja, da lag ich ja mit meiner Antwort schon ganz gut, du solltest nun selber zurechtkommen, oder?
Hatte nur Format-Problem ist wieder da
ich denke du meinst
edb=# select * from mail_csv left join mail on (mail_csv.id = mail.id);

oder?

PS alles Klar ich brauche fast alle Zeilen deines Beispieles Hmf schade ich dachte der Code wäre so einfach wie ein einfaches select oder insert into
 
Zuletzt bearbeitet:
mit einem JOIN, siehe mein Beispiel.

hab nun endlich mal Zeit gefunden es zu testen
leider scheitert es schon am Befehl:
CREATE EXTENSION file_fdw;

/* SQL Fehler (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXTENSION file_fdw' at line 1 */
/* Betroffene Zeilen: 0 Gefundene Zeilen: 0 Warnungen: 0 Dauer von 0 of 1 Abfrage: 0,000 sec. */

ich nutze MySQL Version 5.6.51
 
Mit dieser DB in dieser Version ist es keine Überraschung, dass Fehler kommen.
Du solltest Dein System aktualisieren, es ist prähistorisch. Und wenn Du Dir schon die Mühe machst, vielleicht gleich den Hersteller wechseln, dann funktioniert der Code auch.

Wenn Du bei Deinem System bleibst, musst Du analoge Befehle oder Workarounds nutzen, um die fehlenden Funktionen wett zu machen.
 
ich nutze MySQL Version 5.6.51

ah ja, alles klar, ich nutze eine ERHEBLICH bessere Version:

Code:
edb=*# select version();
                                                                               version                                                                               
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 13.2 (EnterpriseDB Advanced Server 13.2.5 (Ubuntu 13.2.5-1+ubuntu4)) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit
(1 row)

es würde aber auch eine ca. 10 Jahre alte PostgreSQL-Community-Version reichen. Alles, wirklich alles ist besser als MySQL ...
 
Werbung:
ah ja, alles klar, ich nutze eine ERHEBLICH bessere Version:
Ich habe zu Anfang aber geschrieben das ich MySQL nutze!!!!
Egal, ich räume dieses Datenchaos hier auf um ein vernünftiges Backup machen zu können und um dann ein neues System aufzusetzen.
Jetzt werde ich Ds Datnchaos backupen und gleich neu aufsetzen.
Hier läuft Windows Server, mich wundert das der entsprechende MySQL-Installer mir das Update nicht vorgeschlagen hat
 
Zurück
Oben