String zerteilen / aufsplitten



  • tagchen...
    erstmal danke für eure vielen hinweise und tips.
    habe das jetzt wie folgt gehandhabt.

    CString pfad_gesamt = "zwischen\\austausch.txt"; 
    CStdioFile File; 
    
    if (File.Open(_T(pfad_gesamt), CFile::modeRead)) 
    { 
        CString strText, strResult,s_text, test; 
        int aufsplitten;
        CString dateiname, tester; 
        int a, l, b, c, d, test_l, w;
        CString daten[100];
    
        while(File.ReadString(strText)) 
        { 
    	if (dateiname.IsEmpty()) // die erste Zeile 
    	{ 
               s_text.Format("%s", strText);
    	  DatenEintrag(s_text);
    	  c=0;
    	  // Standard 12 Kommas 
    	 for (a=0; a<12; a++)
    	 {
    	    dateiname = strText;
    	    tester="";
    	    test="";
    	    l=strlen(dateiname);	// Länge des Strings
    	    aufsplitten=strText.Find(','); // stelle wo komma gefunden.
    	    for (b=c; b<=aufsplitten; b++)
    	    {
    	       test=test+dateiname[b];
    	    }
    	    s_text.Format("%s", test);
    	    DatenEintrag(s_text);
    
                 for (d=b; d<l; d++)
    	    {
    	      tester=tester+dateiname[d];
    	    }
    	    w=strlen(test);
    	    for (test_l=0; test_l<w-1; test_l++)
    	    {
    		daten[a]=daten[a]+test[test_l];
    	    }
    	    strText=tester;
    
    	} 
    	s_text.Format("%s", daten[0]);
    	DatenEintrag(s_text);
    
    	CSaugenSet rs; 
    	rs.Open(CRecordset::forwardOnly,"INSERT INTO customer VALUES ('"+daten[0]+"','"+daten[1]+"','12','12','12','12','12','12','12','12','12','12','12','12','12')",CRecordset::executeDirect); 
    
          } 
          else 
          { 
            // Zeilen 2 - ...				
          } 		
      } 
    }
    

    ist zwar sicherlich umständlich aber es funktioniert. die variablen etc werden alle noch umbenannt, dieses script diente nur zu testzwecken.
    der ursprungsstring sieht ungefähr so aus:

    nachname,tester,tester,tester,tesre,00000,tester,014789654,123456789,irgendwas@irgendwo.de,keine ahnung,,

    ich habe nur noch ein problem.
    und zwar will ich jetzt die einzelnen daten in ne db schreiben.
    aber da bringt der mir ne fehlermeldung:
    "You hav an SQL Syntax error...."
    wisst ihr vielleicht was ich da falsch mache?!
    Danke schonmal für eure hilfe und Mühe.
    THX a lot.
    bartholomeus



  • 1.) Musst du nicht die Spaltennamen angeben?
    2.) Zeichenketten gehören in einzelne Anführungszeichen.



  • 1.) Musst du nicht die Spaltennamen angeben?
    2.) Zeichenketten gehören in einzelne Anführungszeichen.

    mhm...
    zu 1. ich kenne es nicht so. bei nem INSERT INTO gibt man keine spaltenname an. Man muss nur darauf achten, die Anzahl einzuhalten. oder sehe ich das falsch?

    zu 2. wie jetzt. laut meinem beispiel müsste ich dann was schreiben?
    Insert into ... values ('+daten[0]+',....) ????

    ich werd mal schauen ob ich das hinbekomme!
    danke erstmal
    bartholomeus



  • Hallo,
    @Bart, könntest du eine Zeile aus deiner Datei posten, Du kannst natürlich die echten Werte mit Beispielwerten ersetzen!
    Hast gesagt die Werte sind mit Komma getrennt, eine *.csv Datei?
    Mich würde der genaue Satzaufbau interesieren.
    Ich meine das man die Zeilen wenn sie schon mit Komma getrennt sind auch einfacher zerlegen kann!? 🙄

    lg
    pixel



  • tagchen...

    @Bart, könntest du eine Zeile aus deiner Datei posten, Du kannst natürlich die echten Werte mit Beispielwerten ersetzen!

    also:
    "nachname,tester,tester,tester,tesre,00000,tester,014789654,123456789,irgendwas@irgendwo.de,keine ahnung,,"
    sowas steht in meiner txt datei drin... und das zeilenweise....

    Ich meine das man die Zeilen wenn sie schon mit Komma getrennt sind auch einfacher zerlegen kann!?

    Sicherlich kann man das einfacher machen, wie ich das gemacht habe. Dasproblem ist, ich bin anfänger auf dem gebiet der c++ / MFC von daher bin ich froh das es funktioniert. auch wenn es nicht die feine englische art ist.

    aber kannst du mir vielleicht helfen wie ich den sql error beseitige?
    thx a lot
    cu bartholomeus



  • Hallo,

    hab gerade nachgeschaut, eigendlich sollen die spalten namen schon mit angegeben werden??!!!

    // Use a VALUES clause to specify the data values for one row: 
    INSERT INTO MyTable (PriKey, Description)
           VALUES (123, 'A description of part 123.')
    

    cu
    pixel



  • Möglicherweise mag er das INSERT direkt im Open-Befehl nicht. Laut MSDN kannste bei CRecordset::Open nur ein SELECT-Statement mitschicken.



  • Ich hab das jetzt nicht mehr so präsent, aber kann man bei forwardonly überhaupt ein INSERT ausführen?



  • tagchen...
    also habe jetzt auch die spaltennamen nochmal mit hinzugefügt, trotzdem kein erfolg.
    desweiteren habe ich das forwardonly ersetzt:
    dynaset, snapshot, forwardOnly, dynamic
    funktioniert aber auch nicht. bzw bei dynaset kommt, das der treiber nicht unterstützt wird...

    irgendwie komm ich hier absolut nicht weiter, und weiß nicht was ich noch machen kann..
    hoffe ihr könnt helfen und bedanke mich schonmal
    thx a lot
    cu bartholomeus



  • Hallo,
    warum glaubst du das daten[0] in die doppelten hochkommas muessen?
    Hast versucht die mal weg zu nehmen, so das nur die Variable steht, also in den einfachen hochkommas? 😕
    Versuchs mal ohne:

    //INSERT INTO customer VALUES ('"+daten[0]+"','"+daten[1]+",...);
    INSERT INTO customer VALUES ('+daten[0]+','+daten[1]+',...);
    

    lg



  • ja das habe ich auch schon gemacht. funktioniert nicht. das mit den Hochkommas oder anführungszeichen habe ich versehentlich aus php übernommen, da das eigentlich mein gebiet ist.. naja..

    ich habe es anders gemacht aber immer noch einen fehler:

    CSaugenSet rs; 
    rs.Open(CRecordset::snapshot,NULL,CRecordset::appendOnly); 
    
    rs.AddNew();
    rs.m_c_id = daten[1];
    rs.m_c_vorname = daten[1];
    rs.m_c_nachname=daten[2];
    rs.m_c_strasse = daten[3];
    rs.m_c_hnr=daten[4];
    rs.m_c_plz=daten[5];
    rs.m_c_ort=daten[6];
    rs.m_c_telefon=daten[7];
    rs.m_c_telefax=daten[8];
    rs.m_c_email=daten[9];
    rs.m_c_land=daten[10];
    rs.m_c_bank=daten[11];
    rs.m_c_konto=daten[12];
    rs.m_c_blz=daten[13];
    rs.m_l_user=daten[14];
    rs.Update();
    

    habe es mit snapshot versucht zu öffnen. dabei kommt folgende fehlermeldung:
    "Datensatzgruppe kann nur gelesen werden"

    wie bekomm ich das weg???
    danke nochmal... und sorry das ich soviel nerve...



  • Spendier der Tabelle doch mal einen Primärschlüssel.



  • na hab ich doch.... und zwar c_id...



  • MSDN:
    CRecordset::appendOnly Do not allow Edit or Delete on the recordset. Allow AddNew only. This option is mutually exclusive with CRecordset::readOnly.
    Vielleicht funktioniert ja
    CRecordset::none No options set. This parameter value is mutually exclusive with all other values. By default, the recordset can be updated with Edit or Delete and allows appending new records with AddNew. Updatability depends on the data source as well as on the nOpenType option you specify.



  • mal SQL-Nachhilfe geben^^

    Die Angabe der Spalten kannst du weglassen, wenn du alle füllst. Wenn du aber nur bestimmte Spalten einer Zeile hinzufügen willst, dann musst dem System natürlich mitteilen welche.

    So CRecordset ist grundsätzlich dazu da, um Daten aus der Datenbank zu holen. Daher ist ein INSERT da fehl am Platze. ALlerdings funktioniert es(Leider), wenn nach dem SELECT-Statement noch nen INSERT steht. Generell werden alle noch dranhängenden SQL-Befehle ausgeführt im Recordset-Open.

    Wenn du SQL ausführen willst, welches keine Daten zurück liefert, dann benutzt man CDatabase::ExecuteSQL. Dort kann dann das INSERT rein.



  • tagchen...
    also danke erstmal für eure hilfe und mühe.
    habe es jetzt endlich gelöst.

    ich realisiere ja alles mit der Crecordset klasse. Habe meine DB und spreche 4 tabellen an. In eine der tabellen will ich daten einfügen. So geht das aber nicht mit Crecordset. so wie ich es gelesen und verstanden habe, erwartet Crecordset für alle angesprochenen tabellen irgendwelche abfrage oder routinen oder sonstiges. sobald ich aber nur diese eine tabelle meiner db anspreche und damit den datenaustausch vornehme klappt alles wunderbar.
    auf jedenfalls gehts so...

    THX a lot
    cu bartholomeus



  • Du hast ein Recordset über 4 Tabellen?
    Ahja, klar dann kannst du nur lesen, das ist dann nämlich ein View. 😉



  • tagchen...

    achso... gut... und wie bekomm ich das hin, dass ich auf mehrere tabellen zugreife?
    bzw mein problem ist zu zeit: ich habe ne online db und ne offline db und möchte ein datenaustausch durchführen. habe das gerade mittels einer txt datei realisert und 2 programmen.. kann man das eigentlich auch alles in einem programm vereinbaren? bzw ist es möglich in einem programm zwei verschiedene datenbanken (sql server) anzusprechen?
    muss dazu sagen, bin blutiger anfänger auf dem gebiet.
    ich danke schonmal!
    thx a lot.
    cu bartholomeus



  • Klar kannst du mehrere ansprechen. Es gibt ja keine Beschränkung auf ein CRecordset-Objekt. Du kannst ja mehrere anlegen.
    Pro Tabelle sollte man ein Recordset nehmen, zumindest wenn du ne eigene Klasse ableitest, ansonsten halt JOINS usw per SELECT entsprechend zusammen basteln.



  • Hi!

    Mach doch mal ne zweite (oder noch mehr) von CRecordset abgeleitete Klasse.
    Die einzelnen Klassen können auf völlig verschiedene Tabellen zugreifen, aber auch unterschiedliche Datenbanken auf verschiedenen Servern sind möglich. 🙂

    Du wirst beim Erstellen der Klasse ja gefragt. (Und später ist es auch änderbar.)

    Wenn du schreiben können willst, gilt: 1 Recordset pro Tabelle.


Anmelden zum Antworten