(In C) Inhalt einer Textdatei in MySQL Datenbank schreiben



  • Hallo Leute!

    Ich bin neu hier und hoffe mal dass ihr mir helfen könnt. Mein Code ist in einfachem C geschrieben (wie man unten sehen kann 🙂 ). Zur Zeit schreibe ich ein Programm, dass Daten aus einer Textdatei ausliest und diese dann in 2 verschiedene Tables (tbl1 und tbl2) einer MySQL-Datenbank schreiben soll. Ich steh noch ziemlich am Anfang meines Programms und weiß im Moment nicht mehr weiter. Meine Frage ist folgende: Wie kann ich die Daten aus der Datei in die Datenbank schreiben?

    Hier mal mein Code:

    /*Includes*/
    #include <stdio.h>
    #include <mysql.h>
    #include <stdlib.h>
    
    /*Prototypen*/
    int connect_DB();
    void close_conect(MYSQL*);
    int open_stream();
    
    /*Globale Variablen*/
    extern int errno;
    
    int main(int argc, char *argv[]) {
    
            connect_DB();
            open_stream();
            return 0;
    }
    
    /*Diese Funktion stellt eine Verbindung zur Datenbank (Alarmmanager) her*/
    int connect_DB() {
    
            /*Variablen*/
            MYSQL *conn;        /*Fuer Verbindung benoetigt*/
    
            /*Verbindung zu MySQL*/
            conn = mysql_init(NULL);
            if (mysql_real_connect( conn,
                                    "Adresse",
                                    "name",
                                    "pwd",
                                    "Datenbank",
                                    xxxx,
                                    NULL,
                                    0) == NULL) {
                    fprintf(stderr, "Fehler mysql_real_connect(): "
                            "%u (%s)\n", mysql_errno(conn), mysql_error(conn));
                    exit(EXIT_FAILURE);
            } else {
                    printf("Erfolgreich mit dem MySQL-Server verbunden! \n\n");
            }
    
            /*Falls eine Unicode-Ausgabe erwuenscht ist bitte einkommentieren*/
            /*mysql_query(conn, "SET NAMES 'utf8'");*/
    
            /*Verbindung zur Datenbank schliessen*/
            close_conect(conn);
    
            return 0;
    }
    
    /*Mit Hilfe dieser Funktion wird die Verbindung zur Datenbank wieder geschlossen
      und der belegte Speicher wird frei gegeben*/
    void close_conect(MYSQL *mysql) {
            mysql_close(mysql);
    
            /*printf("Die Verbindung wurde geschlossen! \n");*/
    }
    
    /*Diese Funktion oeffnet die Datei 200X_XX_XX_XX_WLAN_DB.txt*/
    int open_stream() {
    
            /*Variablen*/
            FILE *datei;
    
            datei = fopen("/home/tracer/trace_history/060503/filter/2006_05_03_23_WLAN_DB.txt", "rt");
            if (datei == NULL) {
                    perror("Fehler beim oeffnen der Datei '2006_05_03_23_WLAN_DB.txt' \n");
                    exit(EXIT_FAILURE);
            } else {
                    printf("Datei wurde erfolgreich zum Lesen geoeffnet \n");
            }
    
            /*Datei wieder schliessen*/
            fclose(datei);
    
            return EXIT_SUCCESS;
    
    }
    

    Alles was da steht funktioniert auch wunderbar, ich weiß nur nicht mehr weiter! Für alle euere Antworten bin ich sehr dankbar!



  • da fehlt ja noch einiges - hast du ahnung von den SQL-Befehlen?
    also zuerst sollte das das feld vom type text oder sowas inner art sein, dann führst du einfach mit der funktion mysql_query (--> mysql reference) einen INSERT-Query aus, der den text beinhaltet - hab hier grad garnix, kann dir ma die konkreten sachen posten wenn du mir ma sagst wie deine tabelle aussieht 🙂

    mfg blan



  • Hallo blan!

    Erst mal danke für deine Antwort und dein Angebot mir zu helfen! Also hier sind mal die Daten die in der Textdatei stehen:


    Request,2006-04-28,02:01:08,208.54.89.24,193.254.174.19,235,49600001.test@t-mobile.de,10.192.7.1,,02,@t-mobile.de,Request,,,,,1,01,t-mobile,us, 20038 T-Mobile HotSpot Carrollton
    Reject,2006-04-28,02:01:08,193.254.174.19,208.54.89.24,235,,,User account (temporarily) disabled,02,,Response,,,,,1,01,,,
    Request,2006-04-28,02:02:03,193.254.174.19,217.41.239.88,162,kme1401535@btopenzone.com,193.254.174.43,,02,@btopenzone.com,Request,UK,44,00000,UK_95976,1,02,T-Mobile,UK,UK;TMUK;Hotel;other;Worcester;UK_959765;WET
    Accept,2006-04-28,02:02:03,217.41.239.88,193.254.174.19,162,kme1401535@btopenzone.com,193.254.174.43,,02,@btopenzone.com,Response,,,,,1,02,,,
    Request,2006-04-28,02:02:46,208.54.89.23,193.254.174.18,111,49600001.test@t-mobile.de,10.192.7.1,,02,@t-mobile.de,Request,,,,,1,02,t-mobile,us, 20038 T-Mobile HotSpot Carrollton
    Reject,2006-04-28,02:02:46,193.254.174.18,208.54.89.23,111,,,User account (temporarily) disabled,02,,Response,,,,,1,02,,,
    Request,2006-04-28,02:02:55,193.254.174.18,192.168.1.70,71,+36304444444@t-mobile.hu,193.254.174.45,,02,@t-mobile.hu,Request,NL,31,00000,NL_NY0000_test,1,02,TMOBILE,NL,Test_Nuremberg_NL
    Request,2006-04-28,02:02:56,193.254.174.18,203.116.3.68,132,tmobile@wifiarea.it,193.254.174.45,,02,@wifiarea.it,Request,NL,31,00000,NL_NY0000_test,1,02,TMOBILE,NL,Test_Nuremberg_NL
    Reject,2006-04-28,02:03:00,203.116.3.68,193.254.174.18,132,,,Unknown User,02,,Response,,,,,1,03,,,
    Request,2006-04-28,02:03:08,208.54.89.24,193.254.174.19,211,49600001.test@t-mobile.de,10.192.7.1,,02,@t-mobile.de,Request,,,,,1,03,t-mobile,us, 20038 T-Mobile HotSpot Carrollton
    Reject,2006-04-28,02:03:08,193.254.174.19,208.54.89.24,211,,,User account (temporarily) disabled,02,,Response,,,,,1,03,,,
    Request,2006-04-28,02:03:45,193.254.174.18,192.168.1.70,69,602200013@era.pl,193.254.174.45,,02,@era.pl,Request,NL,31,00000,NL_NY0000_test,1,03,TMOBILE,NL,Test_Nuremberg_NL
    Accept,2006-04-28,02:03:46,192.168.1.70,193.254.174.18,69,602200013@era.pl,193.254.174.45,,02,@era.pl,Response,NL,31,00000,NL_NY0000_test,1,03,TMOBILE,NL,Test_Nuremberg_NL
    Request,2006-04-28,02:04:41,193.254.174.18,217.41.239.89,51,tmobeurtest1@btopenzone.com,193.254.174.45,,02,@btopenzone.com,Request,NL,31,00000,NL_NY0000_test,1,04,T-Mobile,NL,NL;TMNL;Airport_Airlounge;Airport;Frankfurt;NL_NY0000_test3;CET
    Reject,2006-04-28,02:04:41,217.41.239.89,193.254.174.18,51,,,Duplicated Login,02,,Response,,,,,1,04,,,
    Request,2006-04-28,02:04:45,208.54.89.23,193.254.174.18,122,49600001.test@t-mobile.de,10.192.7.1,,02,@t-mobile.de,Request,,,,,1,04,t-mobile,us, 20038 T-Mobile HotSpot Carrollton
    Reject,2006-04-28,02:04:45,193.254.174.18,208.54.89.23,122,,,User account (temporarily) disabled,02,,Response,,,,,1,04,,,
    Request,2006-04-28,02:04:55,193.254.174.18,203.116.3.68,133,41793074358@swisscom-mobile.ch,193.254.174.45,,02,@swisscom-mobile.ch,Request,NL,31,00000,NL_NY0000_test,1,04,TMOBILE,NL,Test_Nuremberg_NL
    Reject,2006-04-28,02:04:56,203.116.3.68,193.254.174.18,133,,,SCM_MAAA_UnknownUser,02,,Response,,,,,1,04,,,
    Request,2006-04-28,02:05:08,208.54.89.24,193.254.174.19,182,49600001.test@t-mobile.de,10.192.7.1,,02,@t-mobile.de,Request,,,,,1,05,t-mobile,us, 20038 T-Mobile HotSpot Carrollton
    Reject,2006-04-28,02:05:08,193.254.174.19,208.54.89.24,182,,,User account (temporarily) disabled,02,,Response,,,,,1,05,,,
    Request,2006-04-28,02:05:13,193.254.174.18,192.168.1.70,77,tmobile2@kpnhotspots.com,193.254.174.45,,02,@kpnhotspots.com,Request,NL,31,00000,NL_NY0000_test,1,05,TMOBILE,NL,Test_Nuremberg_NL
    Accept,2006-04-28,02:05:13,192.168.1.70,193.254.174.18,77,,,,02,,Response,,,,,1,05,,,

    Tja und die Datenbanktabellen sind einfach nur mit vielen varchars und wenigen ints. Meine Kenntnisse von SQL sind eher bescheiden, da ich grade mal am Anfang von dem ganzen stehe! Leider! 😕 Ich weiß aber nicht was ich dir noch so sagen könnte, da ich ja, wie schon erwähnt, im Moment auch keine Ahnung habe was alles wichtig sein könnte! Ich hoffe mal dass das so passt!



  • Hallo!

    Also ich bin einen Schritt weiter. Durch den SQL-Befehl LOAD DATA INFILE sollte ich ja offensichtlich den Inhalt der .txt Datei in den Zieltable schreiben können. Nur bei mir klappt das irgendwie nicht. Meine ganzen Ausgaben sagen mir dass alles in Ordnung ist. Ich habe das alles auch schon mit einem (eigens kreiertem) .txt File gemacht. Leider wird nichts in die Tabelle eingetragen. Wo liegt mein Fehler? Ist es ein Denkfehler? Hier noch mal mein "neuer" Code:

    /*Includes*/
    #include <stdio.h>
    #include <mysql.h>
    #include <stdlib.h>
    
    /*Prototypen*/
    int connect_DB();
    void close_conect(MYSQL*);
    int open_stream();
    void import_data();
    
    /*Globale Variablen*/
    extern int errno;
    
    int main(int argc, char *argv[]) {
    
            connect_DB();
            return 0;
    }
    
    /*-------------------------------------------------------------------------------------------------------------------------------------------------*/
    /*Diese Funktion stellt eine Verbindung zur Datenbank (Alarmmanager) her*/
    int connect_DB() {
    
            /*Variablen*/
            MYSQL *conn;        /*Fuer Verbindung benoetigt*/
    
            /*Verbindung zu MySQL*/
            conn = mysql_init(NULL);
            if (mysql_real_connect( conn,
                                    "2.9.153.47",
                                    "root",
                                    "root",
                                    "alarmmanager",
                                    3306,
                                    NULL,
                                    0) == NULL) {
                    fprintf(stderr, "Fehler mysql_real_connect(): "
                            "%u (%s)\n", mysql_errno(conn), mysql_error(conn));
                    exit(EXIT_FAILURE);
            } else {
                    printf("Erfolgreich mit dem MySQL-Server verbunden! \n\n");
            }
    
            /*Falls eine Unicode-Ausgabe erwuenscht ist bitte einkommentieren*/
            /*mysql_query(conn, "SET NAMES 'utf8'");*/
    
            /*Aufruf der Funktion, um die Datei in die DB zu schreiben*/
            open_stream();
    
            /*Verbindung zur Datenbank schliessen*/
            close_conect(conn);
    
            return 0;
    }
    
    /*Mit Hilfe dieser Funktion wird die Verbindung zur Datenbank wieder geschlossen
      und der belegte Speicher wird frei gegeben*/
    void close_conect(MYSQL *mysql) {
            mysql_close(mysql);
            printf("\nVerbindung wieder geschlossen! \n");
    }
    
    /*-------------------------------------------------------------------------------------------------------------------------------------------------*/
    /*Diese Funktion oeffnet die Datei 200X_XX_XX_XX_WLAN_DB.txt*/
    int open_stream() {
    
            /*Variablen*/
            FILE *datei;
    
            datei = fopen("/home/tracer/trace_history/060503/filter/2006_05_03_23_WLAN_DB.txt", "rt");
            if (datei == NULL) {
                    perror("Fehler beim oeffnen der Datei '2006_05_03_23_WLAN_DB.txt' \n");
                    exit(EXIT_FAILURE);
            } else {
                    printf("Datei wurde erfolgreich zum Lesen geoeffnet \n");
            }
    
            /*Aufruf der Funktion*/
            import_data();
    
            /*Datei wieder schliessen*/
            fclose(datei);
            printf("Datei geschlossen\n");
    
            return EXIT_SUCCESS;
    
    }
    
    /*-------------------------------------------------------------------------------------------------------------------------------------------------*/
    /*In dieser Funktion wird das Textfile ausgelesen und der Inhalt in die
      Datenbank importiert*/
    void import_data() {
    
            const char *sql = "LOAD DATA LOCAL  INFILE '/home/tracer/trace_history/060503/filter/2006_05_03_23_WLAN_DB.txt' \
                                    FIELDS TERMINATED BY ',' \
                                    LINES TERMINATED BY '\n' \
                                    INTO TABLE tblamwlan (RDID, RohDatenID, AlarmText, Land, Netz, Requests, Response, Difference \
                                    Percent, BearbeitungsStatus, MCC, MNC)";
            printf("Eingetragen \n");
    }
    


  • Hat denn niemand einen Ansatz für mich?



  • Wie ich sehe entwickelst du unter Unix.

    Gibt es da sowas wie phpMyAdmin? Wenn ja dann überprüf einfach mal dort deine SQL-Syntax.
    Ich hab die Erfahrung gemacht, dass dich in der SQL-Syntax öfters mal ein Fehler einschleicht. Zum Beispiel ein " statt eines '.

    Wenn du die Syntax gecheckt hast und es immer noch Fehler gibt (oder nichts passiert), dann kannst du nach Problemen in deinem Code suchen.



  • Jetzt hab ich erstmal deinen Code angeschaut ...

    Buba235 schrieb:

    datei = fopen("/home/tracer/trace_history/060503/filter/2006_05_03_23_WLAN_DB.txt", "rt");
            if (datei == NULL) {
                    perror("Fehler beim oeffnen der Datei '2006_05_03_23_WLAN_DB.txt' \n");
                    exit(EXIT_FAILURE);
            } else {
                    printf("Datei wurde erfolgreich zum Lesen geoeffnet \n");
            }
    
            /*Aufruf der Funktion*/
            import_data();
    

    Du öffnest die Datei. Wieso? Du liest ja nicht daraus. Wenn die Datei offen ist, rufst du die Funktion auf, die die Datei in die DB schreiben soll.
    Da könnte es später hängen, weil du das FileHandle offen hast.

    Buba235 schrieb:

    /*-------------------------------------------------------------------------------------------------------------------------------------------------*/
    /*In dieser Funktion wird das Textfile ausgelesen und der Inhalt in die
      Datenbank importiert*/
    void import_data() {
    
            const char *sql = "LOAD DATA LOCAL  INFILE '/home/tracer/trace_history/060503/filter/2006_05_03_23_WLAN_DB.txt' \
                                    FIELDS TERMINATED BY ',' \
                                    LINES TERMINATED BY '\n' \
                                    INTO TABLE tblamwlan (RDID, RohDatenID, AlarmText, Land, Netz, Requests, Response, Difference \
                                    Percent, BearbeitungsStatus, MCC, MNC)";
            printf("Eingetragen \n");
    }
    

    Du baust den sql-String wunderschön zusammen. Aber wo ist die Funktion, die den String an mySQL übergibt?



  • Also wernn ich mir deine Daten so ansehe
    Request,2006-04-28,02:01:08,

    Kommt da als 2tes Feld z.B. ein Datum.
    Die Namen deiner Tabelle
    RDID, RohDatenID, AlarmText

    sehen aber nicht so aus als würde das da reinpassen.
    Denke nicht das RohDatenID und AlarmText ein Date oder Time ist.
    Unabhängig von deinen anderen Problemchen.



  • Hallo!

    RohDatenID usw. sind die Daten aus der zweiten Tabelle. Ich muss ja die Daten aus dieser Datei in 2 Tabellen aufteilen.



  • Hallo!

    Okay ich hab es geschafft das ganze (also mein Testfile) in die Datenbank zu schreiben. Es funktioniert wunderbar! Hier mal mein Code:

    /*Includes*/
    #include <stdio.h>
    #include <mysql.h>
    #include <stdlib.h>
    
    /*Prototypen*/
    int connect_DB();
    void close_conect(MYSQL*);
    void import_data(MYSQL*);
    
    /*Globale Variablen*/
    extern int errno;
    
    int main(int argc, char *argv[]) {
    
            /*Aufruf der Funktionen*/
            connect_DB();
            return 0;
    }
    
    /*----------------------------------------------------------------------------*/
    /*Diese Funktion stellt eine Verbindung zur Datenbank (Alarmmanager) her*/
    int connect_DB() {
    
            /*Variablen*/
            MYSQL *conn;        /*Fuer Verbindung benoetigt*/
    
            /*Verbindung zu MySQL*/
            conn = mysql_init(NULL);
            if (mysql_real_connect( conn,
                                    "2.9.153.47",
                                    "root",
                                    "root",
                                    "alarmmanager",
                                    3306,
                                    NULL,
                                    0) == NULL) {
                    fprintf(stderr, "Fehler mysql_real_connect(): "
                            "%u (%s)\n", mysql_errno(conn), mysql_error(conn));
                    exit(EXIT_FAILURE);
            }
    
            /*Aufruf der Funktion, um die Datei in die DB zu schreiben*/
            import_data(conn);
    
            /*Verbindung zur Datenbank schliessen*/
            close_conect(conn);
    
            return 0;
    }
    
    /*Mit Hilfe dieser Funktion wird die Verbindung zur Datenbank wieder
      geschlossen und der belegte Speicher wird frei gegeben*/
    void close_conect(MYSQL *mysql) {
            mysql_close(mysql);
    }
    
    /*----------------------------------------------------------------------------*/
    /*In dieser Funktion wird das Textfile ausgelesen und der Inhalt in die
      Datenbank importiert*/
    void import_data(MYSQL *conn) {
    
            const char *sql = "LOAD DATA LOCAL INFILE 'test.txt' \
                                    INTO TABLE tblamwlan \
                                    FIELDS TERMINATED BY ',' \
                                    LINES TERMINATED BY '\n'";
    
            /*Fehlerabfrage*/
            mysql_query(conn, sql);
            if (sql != 0) {
                    fprintf(stderr, "%s\n", mysql_error(conn));
                    fprintf(stderr, "%s\n", sql);
                    exit(EXIT_FAILURE);
            }
    }
    

    Soweit so gut. Das ganze funktioniert mit einem Testfile, das genau auf diese Tabelle abgestimmt ist. Jetzt beginnt aber der ekelhafte Teil das ganze mit dem original File auf 2 Tabellen aufzuteilen. Sorry, aber da bin ich im Moment echt super ahnungslos! Wie könnte ich das denn machen? Ich bräuchte nur einen kleinen Denkanstoß oder einen Ansatz!

    Übrigens danke für euere Antworten!



  • Dafür musst du wohl oder übel den Inhalt des Files in interne Datenstrukturen einlesen. Und dann die jeweiligen Datensätze die du hast, entsprechend in die Tabellen eintragen.



  • Hallo!

    Klingt interessant, aber ehrlich gesagt hab ich keine Ahnung wie das gehen soll! Kannst du mir mal ein Beispiel geben? Wäre super - Danke!



  • Ganz einfach.

    Datei auslesen
    Nach kommas trennen.
    SQLQUERY erzeugen
    In Datenbank schreiben.

    Das hat aber was mit C/C++ und nichts mit Datenbanken zu tun.



  • Danke, danke!

    Ihr habt mir sehr geholfen! Ich hab es fast geschafft! Das Topic kann so abgeschlossen werden. Gutes Forum!


Anmelden zum Antworten