QRegExp String zerlegen

Alles rund um die Programmierung mit Qt
Antworten
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

QRegExp String zerlegen

Beitrag von jd »

Hallo Gemeinde,

Ich habe eine Textdatei, welche in eine Datenbank importiert werden soll. Jedoch habe ich Probleme bei der Zerlegung. Die Doku über QRegExp habe ich mir durchgelesen, aber ich finde irgendwie keinen Ansatz.

Aufbau der Textdatei:
"001","Hallo Welt","test5","test 3"
"","","test","leer"

Jeder "String" steht zwischen zwei "-Zeichen, die Strings sind durch ,-Komma getrennt.

Als erstes Zerlege ich die Textdatei in die einzelnen Zeilen.

Code:

Code: Alles auswählen

QTextStream in(&importData);
	QString data = in.readAll();
	QStringList dataLine = data.split("\n", QString::SkipEmptyParts);
	QStringList dataLineSplit;

	for (int i=0; i<dataLine.size(); i++) {
		dataLineSplit = dataLine[i].split(QRegExp(/*Rule*/);
	}
Es scheitert daran, da ich nicht weiß wie ich die QRegExp Regel schreiben muss, hat da jemand eine Idee, wie das machen könnte?

so long

jd
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn man keine RegExps kann - warum geht man nicht den einfacheren Weg über QString::split()?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Er will es ja mit split machen, nur eben mit einer RegularExpression als Trenner, statt einfach das Anführungszeichen zu nehmen und die Kommas wegzuwerfen.
Immer wieder gut wenn jemand RegExp lernen will:
http://www.regular-expressions.info/
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und warum sollte man da ne RegExp brauchen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Über Sinn und Unsinn habe ich mich nicht ausgelassen, halte es aber auch für falsch. RegExp kämen in Frage wenn der Trenner nicht klar definiert wäre, was hier aber der Fall ist. Ein einfaches split ist wohl deutlich schneller.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Re: QRegExp String zerlegen

Beitrag von honda71 »

jd hat geschrieben:(...)

Es scheitert daran, da ich nicht weiß wie ich die QRegExp Regel schreiben muss, hat da jemand eine Idee, wie das machen könnte?

so long

jd
dataLineSplit = dataLine.split(QRegExp("","|""));

Beachte aber bitte, dass das erste und das letzte Element ebenfalls mit leerem Wert vorhanden sind. Das rührt daher, dass bei jedem Auftreten eines " oder eines "," ein neues Element geschrieben wird....
Diese beiden Elemente müsstest Du dann einfach überlesen...

Gruß

Oli
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Ja haben wir denn die Doku nicht gelesen? :-)
http://doc.trolltech.com/4.3/qstring.ht ... avior-enum
Wenn ich schon eine Lösung bringe, dann auch bitte richtig:

Code: Alles auswählen

dataLineSplit = dataLine[i].split(QRegExp("\",\"|\""), QString::SkipEmptyParts);
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Beitrag von honda71 »

macman hat geschrieben:Ja haben wir denn die Doku nicht gelesen? :-)
http://doc.trolltech.com/4.3/qstring.ht ... avior-enum
Wenn ich schon eine Lösung bringe, dann auch bitte richtig:

Code: Alles auswählen

dataLineSplit = dataLine[i].split(QRegExp("","|""), QString::SkipEmptyParts);
Aus dem String <<"1" , "2" , "3" , "" , "4">>

wird mit QString::SkipEmptyParts -> 1,2,3,4

unser User will aber wohl eher 1,2,3,{leer},4

Einfach Teile aus der Ergebnismenge wegzulassen, ist bestimmt nicht gewünscht, da sich dadurch die Token einer Zeile ab Auftreten eine eines "" plötzlich nach Links verschieben.


Gruß

Oli
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Lass uns noch weiter fachsimpeln, dann verzichtet er vielleicht doch auf QRegExp und nimmt einfach split("\""). Inzwischen sollte er ja genug Anhaltspunkte haben, um sein Problem zu lösen. Beste Lösung wäre immer noch ein Verzicht auf QRegExp.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Beitrag von honda71 »

macman hat geschrieben:Lass uns noch weiter fachsimpeln, dann verzichtet er vielleicht doch auf QRegExp und nimmt einfach split("""). Inzwischen sollte er ja genug Anhaltspunkte haben, um sein Problem zu lösen. Beste Lösung wäre immer noch ein Verzicht auf QRegExp.
Wir können gerne weiter fachsimpeln...

Mittels split(""") sehe ich keine Möglichkeit einer einfacheren Zerlegung. Im Gegenteil... die Ergebnismenge wird mit Einträgen bestehend aus "," zersetzt.

"1","2","3",,"4"

ergibt dann

1
,
2
,
3
,
,
,
4

Keine Ahnung warum das jetzt besser sein soll als meine erste Lösung....

da hatte ich

{leer}
1
2
3
{leer}
4
{leer}

und wusste genau, dass element 0 und das letzte ignoiert werden müssen...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ein einfaches QString::split("\",\"") würde genau das gleiche machen - man muss wie in Deinem Fall das erste und letzte Element nochmal anfassen. Benutzt aber keine umständliche (in der Form "ich habe mal was von RegExp gehört" umständlich) Regexp.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
honda71
Beiträge: 49
Registriert: 12. Juli 2006 16:16

Beitrag von honda71 »

Christian81 hat geschrieben:Ein einfaches QString::split("","") würde genau das gleiche machen - man muss wie in Deinem Fall das erste und letzte Element nochmal anfassen. Benutzt aber keine umständliche (in der Form "ich habe mal was von RegExp gehört" umständlich) Regexp.
Keine Ahnung, warum RegExp umständlich sein soll, aber das einzelne Token in der Ergebnismenge nochmals zu korrigieren... DAS ist umständlich!

Gruß

Oli
Antworten