prob beim matchen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

prob beim matchen

Beitrag von zois »

Hallo Leute!
Ich weis nicht, ob ich hier richtig bin, da es mein erster Forum eintrag ist! Ich brauch aber ein bisschen hilfe und wolltes deshalb versuchen!

Ich habe folgendes problem. Ich importiere aus einer .csv-Datei einen Datensatz, diesen speichere ich in einem String ab und möchte diesen dann mit einem regex quasi spaltenweise durchsuchen. Sprich in dem String sind eine Reihe von Zahlen, getrennt mit einem Semikolon, gespeichert, was ich nun möchte, die Zahlen einzeln(spaltenweise) aufrufen.

wstring str = L"([\\w*\\-,\\.\\s*]+)\\s*;?\\s*";
boost::wregex expression(str, boost::regex::icase);
boost::match_results<wstring::const_iterator> match;
.
.
.
for(...){
boost::regex_search(line , match , expression);

for ((unsigned) int j=1; j < 7(oder match.size()) ; j++) {
wstring imp_vor ( match[j].first, match[j].second ); // der benötigte Ausdruck(Spalten-Wert) aus dem string "line"
.
.
.

Der Fehler tritt jetzt bei imp_vor auf und zwar wird dort nur der erste durchlauf der for-Schleife etwas reingeschrieben, die weiteren durchläufe bleibt imp_vor leer.
Was ist da falsch? Oder gibts es einen anderen Weg, wie ich Spaltenweise, also einen einzelnen Wert in dem string aufrufen kann?

Ich habe da noch ein 2. rangiges Problem im dem Quelltext und zwar wenn ich in der For-Schleife statt der 7 match.size() schreibe bekomme ich warning C4018 beim kompilieren. wenn ich dann j aber als unsigned int deklaliere, wird j nicht hoch gezählt. Wäre schön wenn mir Jemand auch dafür eine Lösung parat hätte. Dies habe ich oben mit Blau markiert!!!

Ich hoffe mir kann Jemand bei meinem Problem helfen!!
ich bedanke mich schon mal im Voraus!!!

gruß

zois
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: prob beim matchen

Beitrag von Sternmull »

Zum ersten Problem lässt sich schwer eine klare Aussage machen weil man weder sieht wo line herkommt, noch was im Rest der Schleife passiert. Bitte reduziere das auf ein Minimalbeispiel bei dem es nicht notwendig ist irgend was aus zu lassen und poste es noch mal vollständig. Und zwar bitte in Code-Tags damit man das besser lesen kann. Die Blau- und Rot-Markiererei könntest du auch durch Kommentare oder #if ersetzen um mehrere Varianten unterzubringen.

Zum 2. Problem:
...keine Ahnung wo deine 7 herkommt. Zum unsigned vs. unsigned: Der Rückgabetyp von boost::match_result::size() ist defaultmäßig vom Typ size_t weil defaultmäßig std::allocator für den Template-Parameter "Allocator" in boost::match_results verwendet wird. Und weil size_t ein vorzeichenloser Integer ist, bekommst du eine Warnung wenn du den mit einem vorzeichenbehafteten vergleichst. Die Warnung C4018 ist übrigens Dokumenteirt (wie auch alle anderen des MS-Compilers). Das Problem ist folgendes: Negative Werte können nicht sinnvoll in eine vorzeichenlose Zahl konvertiert werden (üblicherweise kommt eine sehr große positive Zahl raus), anders rum ist es ähnlich (sehr große vorzeichenlose Integer werden zu negativen vorzeichenbehafteten Integern). Das liegt am Wertebereich: Haben beide Integer die gleiche Anzahl Bits zur Verfügung, so wird ein Bit beim vorzeichenbehafteten für die Speicherung des Vorzeichens verwendet. Beim vorzeichenlosen wird es verwendet um den Wertebereich ins positive auszuweiten.
Beim Vergleich eines vorzeichnelosen mit einem vorzeichenbehafteten Integer muss der Compiler gezungenermaßen eine Konvertierung einbauen weil er ja nicht Äpfel mit Birnen vergleichen will. Bei dieser Konvertierung entsteht das beschriebene Problem und es kommt in entsprechenden Situationen zu einem unerwarteten Ergebnis des Vergleichs.
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: prob beim matchen

Beitrag von zois »

Hallo!

zum 1:
"line" ist der String in dem die Zeilendaten aus der .csv Datei abgespeichert werden!
Und in der For-Schleife kommt eine Switch-Anweisung.

Code: Alles auswählen

	 wstring line;
	wchar_t buf[256];

	wstring str = L"([\\w*\\-,\\.\\s*]+)\\s*;?\\s*";			

	boost::wregex expression(str, boost::regex::icase);			
	boost::match_results<wstring::const_iterator> match;		
	

	for ( int i=0; !file.eof(); i++)		                                                                                // Zeilenweise iterieren
	{

		file.getline(buf, sizeof(buf));		                
		line.clear();
		line.assign(buf);

		  boost::regex_search(line , match , expression);					
		 	
			for ( int j=1; j < 7 ; j++)										//Spalteweise durchlaufen
			{
				wstring imp_vor ( match[1].first, match[1].second );	                      
	
				double wert  = ...                                                                                 // wird für switch benötigt

				switch (j)			                                                                       
				{
				case  1:			
					.
                                        .
                                        .

Benutzeravatar
marcgfx
Establishment
Beiträge: 2062
Registriert: 18.10.2010, 23:26

Re: prob beim matchen

Beitrag von marcgfx »

wird j nicht hoch gezählt
mit anderen worten, du bekommst ne endlosschlaufe? falls nicht , ist vielleicht match.size() = 0

bei .csv habe ich einfach immer die ganze struktur sofort in die einzelteile zerbrochen, erscheint mir einfacher zu sein.
boost scheint auch eine split() funktion anzubieten. die struktur in zeilen zerlegen und dann jede zeile nochmal nach dem komma separieren.
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: prob beim matchen

Beitrag von zois »

nein! j startet ja bei 1 und die Schleife wird dann nur für j=1 durchlaufen!
Das muss ja dann heißen das match.size()<2 (!?)

was ich ja haben möchte ist, wie oft der Ausdruck in dem String vorkommt, damit ich weis wie viel spalten ich habe!
EyDu
Establishment
Beiträge: 101
Registriert: 24.08.2002, 18:52
Wohnort: Berlin
Kontaktdaten:

Re: prob beim matchen

Beitrag von EyDu »

Hallo.

Warum gehst du überhaupt den Umweg über eigene reguläre Ausdrücke? Boost hat für so etwas doch einen schönen Tokenizer. Ich würde Google einfach mal nach "boost csv" befragen. Die ersten Treffer liefern recht schöne Lösungen in wenigen Zeilen.

Sebastian
zois
Beiträge: 10
Registriert: 18.10.2010, 15:37

Re: prob beim matchen

Beitrag von zois »

Habe jetzt beide Probleme gelöst!

1. habe den code leicht geändert und den falschen(!?) Befehl weggelassen.

2. habe das Problem mit boost::regex_split gelöst und dann funktioniert das auch match.size(), wie ich das brauch :)

Danke an alle!!
Antworten