suchen einer bestimmten zeichenkette



  • ok erst mal vielen dank ich werde mich zuhause dann mal hinsetzen muss erst mal los..hast du vll einb bsp code für mich an den ich mich halten kann?



  • ich habe mal ne neue/alte frage...wie kann ich dem sagen das er nur von + bis zu einem komma die zeichen kopieren soll?



  • Du suchst dir mit find() die Startposition und Endposition des gewünschten Teils und schneidest den Abschnitt dazwischen mit substr() heraus:

    size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    string teil = strZeile.substr(start,ende-start);
    

    (eventuell mußt du ein Zeichen mehr oder weniger rausschneiden)



  • jo noch mal vielen dank für die hilfe..wird sicher net die letzte frage sein...;)



  • ich glaub ich und c++ werden nie grosse freunde....jetzt bekomme ich diese fehlermeldung: Abnormal program termination ich habe den code so geschrieben nur noch eine while schleife...

    file.open(filename, ios::in);
    
    	if (file.good())
    	{
    	file.seekg(0L, ios::beg);
    		std::string strZeile;
    		while (! file.eof())
    		{
    			file.getline(zeile, 1024);
    			size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    			string teil = strZeile.substr(start,ende-start);
    		}
    	 }
    
    	else
    	{
    		cout << "Datei nicht gefunden." << endl;
    	}
    

    ich bitte nochmal um hilfe..... 😞



  • Lass doch mal die char-Arrays außen vor und arbeite nur mit std::string's - das erleichtert die Arbeit enorm:

    if (file.good())
    {
        //file.seekg(0L, ios::beg);//das ist überflüssig
        std::string strZeile;
        while (getline(file,strZeile))
        {
            size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
            if(start==string::npos) continue;//kein '+' im Text gefunden
            string teil = strZeile.substr(start,ende-start);
            //und hier solltest du mit 'teil' weiterarbeiten
        }
    }
    


  • ok vielen dank es geht erst mal alles soweit....ich hoffe meine letzte frage..wie kann ich dem sagen das er nur den ersten gefunden namen nehmen soll denn der kommt immer zweimal vor bsp:
    ich will martin alter und markus walther aber in der datei sieht das so aus...
    "CN=martin alter,OU=test,DC=martin,DC=test",user,martin alter,alter,martin,"CN=martin alter,usw...
    "CN=markus walther,OU=untertest,OU=test,DC=martin,DC=test",user,markus, walther,walther,markus,"CN=markus walther,usw... also kommt jeder name 2 mal vor will ihn aber nur einmal haben....

    size_t start1 = strZeile.find('CN='),ende1 = strZeile.find(',',start1);
    		if(start1==string::npos) continue;
    		string teil1 (strZeile.substr(start1,ende1-start1));
    	ofile.open("bla.txt",ios::out|ios::ate);
    	ofile << teil1.insert(0,teil1);
    	ofile.close();
    


  • Erstmal: Wenn du nach Zeichenketten suchen willst, solltest du die in " einschließen.

    Zweitens: Wenn du mehrfache Vorkommen der Namen ausfiltern willst, mußt du zuerst mal erkennen, daß der Name schon kam - und da wäre es ein guter Ansatz, die Namen in eine set/map zu packen und vor der Verarbeitung nachzusehen, ob sie schon dort drin stehen.



  • eine fage habe ich noch..wieso durchläuft er jede zeile 2 mal......?



  • Keine Ahnung - vielleicht solltest du dazu mal die komplette Schleife zeigen.



  • if (file.good())
    	{
    	//file.seekg(0L, ios::beg);
    	std::string strZeile;
    	ofile.open("bla.txt",ios::out|ios::ate);
    	ofile << "Kurzwahlnummern\n";
    		while (getline(file,strZeile))
    		{
    			size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    			if(start==string::npos) continue;
    			string teil (strZeile.substr(start,ende-start));
    		ofile <<  "\t" << teil.insert(0,teil) << "\n";		
    		}
    		ofile.close();
    	}
    

    ausgabe:
    Kurzwahlnummern
    +(49)3520574508+(49)3520574508
    +(49)00335423123+(49)00335423123
    jede nummer steht aber nur einaml drin in der datei



  • alter schrieb:

    ofile << "\t" << teil.insert(0,teil) << "\n";

    Was hat denn das insert() dort zu suchen? Damit fügst du den Inhalt von 'teil' an den Anfang des Strings 'teil' ein (und verdoppelst ihn auf diese Weise). Ein einfaches ofile<<"\t"<<teil<<"\n"; reicht völlig aus.



  • ja ok nun muss ich nur noch die +(49) in eine 00 umwandeln......wie und wo mach ic das am besten?



  • Wo? Zwischen dem Erzeugen von teil und der Ausgabe
    Wie? Ich würde replace() verwenden (unter der Voraussetzung, daß das "+(49)" am Anfang des Strings steht): teil.replace(0/*Startposition*/,4/*Länge*/,"00"/*Ersatztext*/);



  • okdanke aber ichhabe es fast alleine gelöst...*stolz bin nur das ich dann bei der zweiten nummer 0000 habe
    Ausgabe:
    test 1 0 0 003520574508
    test 1 0 1 0000335423123

    if (file.good())
    	{
    	//file.seekg(0L, ios::beg);
    	std::string strZeile;
    	string null ("00");
    	ofile.open("bla.txt",ios::out|ios::ate);
    	ofile << "Kurzwahlnummern\n" << "\t Knoten \t Kurzwahlnummer \t Kurzwahl nach Bereichen \t Kurzwahlnummer \t Rufnummer\n";
    		while (getline(file,strZeile))
    		{
    			size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    			if(start==string::npos) continue;
    			string teil (strZeile.substr(start,ende-start));
    			teil.replace(0,5,null);
    			ofile <<  "\t test \t 1 \t 0 \t" << i << "\t" << teil << "\n";	
    			i++;		
    		}
    
    		ofile.close();
    	}
    

    was ist falsch?



  • replace() ersetzt den angegebenen Teil des Strings - was sonst im String steht, wird ignoriert (und muß von dir ausgewertet werden). Das heißt, wenn du unterschiedliche Behandlungen für "+(49)xyz" und "+(49)00xyz" Nummern brauchst, mußt du erstmal feststellen, wie die aktuelle Nummer aussieht - und dann entsprechend reagieren (if(teil.substr(5,2)=="00")...).



  • oh nein fehler vo mir sry geht alles wunderbar.....hatte nicht gesehn das die tel. schon 2 nullen hatte

    erst mal vielen dank für die hilfe wenn ich fragen habe wende ich mich wieder in thema(wenn es hier rein passt)
    ich werde mich jetzt mehr mit c++ beschäftigen damit ich auch helfen kann und das zurück geben was du mir geholfen hast...*lob an dich*

    gruss alter

    ps: das mit den doppelten null wird nicht passieren das ist eine voraussetzung das die nicht stehen darf also soll ich es nicht prüfen



  • na ich bin es mal wieder...:(
    also 2 fragen...wie kann ich begrenzen das der nachname nur 8 zeichen haben darf und wieso schreibt er mir am ende keine tabs mehr...?

    if (file.good())
    	{
    	//file.seekg(0L, ios::beg);
    	std::string strZeile;
    	string null ("00");
    	ofile.open("bla.txt",ios::out|ios::ate);
    	ofile << "Kurzwahlnummern\n" << "\t Knoten \t Kurzwahlnummer \t Kurzwahl nach Bereichen \t Kurzwahlnummer \t Rufnummer \t Nachname \t Vorname\n";
    		while (getline(file,strZeile))
    		{
    			size_t start = strZeile.find('+'),ende = strZeile.find(',',start);
    			if(start==string::npos) continue;
    			string teil (strZeile.substr(start,ende-start));
    			teil.replace(0,5,null);
    			size_t start2 = strZeile.find(' '),ende2 = strZeile.find(',',start2);
    			if(start2==string::npos) continue;
    			string teil2 (strZeile.substr(start2,ende2-start2));
    			teil2.replace(0,1,"");
    			size_t start1 = strZeile.find("CN="),ende1 = strZeile.find('  ',start1);
    			if(start1==string::npos) continue;
    			string teil1 (strZeile.substr(start1,ende1-start1));
    			teil1.replace(0,3,"");
    			ofile <<  "\ttest\t1\t0\t" << i << "\t" << teil;
    			ofile << "\t" << teil2 << "\t" << teil1 << "\n";	
    			i++;		
    		}
    	ofile.close();
    	}
    

    bei der ausgabe der strings zwischen den namen


Anmelden zum Antworten