Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Inhalt aus Textdatei in MySQL Datenbank 'einsortieren'

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von NoahsRaven, 17 April 2021.

  1. NoahsRaven

    NoahsRaven Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    nicht ganz klar, was dein Problem ist, klingt aber so, als ob dich das Thema joinen zweier Tabellen interessieren könnte.
     
  3. NoahsRaven

    NoahsRaven Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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]
     
  5. akretschmer

    akretschmer Datenbank-Guru

    nun ja, da lag ich ja mit meiner Antwort schon ganz gut, du solltest nun selber zurechtkommen, oder?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    hrm, nun hat er seine Antwort gelöscht ...
     
  7. NoahsRaven

    NoahsRaven Benutzer

    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: 18 April 2021
  8. akretschmer

    akretschmer Datenbank-Guru

    mit einem JOIN, siehe mein Beispiel.
     
  9. NoahsRaven

    NoahsRaven Benutzer

    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: 18 April 2021
  10. NoahsRaven

    NoahsRaven Benutzer

    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
     
  11. dabadepdu

    dabadepdu Datenbank-Guru

    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.
     
  12. NoahsRaven

    NoahsRaven Benutzer

    Was meinst du mit Hersteller wechseln? weg von MySQLoder so?
     
  13. akretschmer

    akretschmer Datenbank-Guru

    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 ...
     
  14. NoahsRaven

    NoahsRaven Benutzer

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden