suchen einer bestimmten zeichenkette



  • 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