(In C) Inhalt einer Textdatei in MySQL Datenbank schreiben



  • 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