Seite 1 von 1
QRegExp String zerlegen
Verfasst: 21. April 2008 10:46
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
Verfasst: 21. April 2008 11:05
von Christian81
Wenn man keine RegExps kann - warum geht man nicht den einfacheren Weg über QString::split()?
Verfasst: 21. April 2008 12:01
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/
Verfasst: 21. April 2008 12:19
von Christian81
Und warum sollte man da ne RegExp brauchen?
Verfasst: 21. April 2008 13:10
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.
Re: QRegExp String zerlegen
Verfasst: 21. April 2008 14:00
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
Verfasst: 21. April 2008 14:45
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);
Verfasst: 21. April 2008 15:14
von honda71
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
Verfasst: 21. April 2008 15:24
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.
Verfasst: 21. April 2008 15:32
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...
Verfasst: 21. April 2008 15:36
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.
Verfasst: 21. April 2008 15:46
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