QString::split() mit QregExp [gelöst]
-
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
QString::split() mit QregExp [gelöst]
Hallo,
kann mir jemand helfen die folgende Strings zu splitten, die zeilenweise eingelesen werden?
"Zeile 1";"Im Text ""Textzeichen"" und Semikolon;";"2010-07-14"; 15
"Zeile 2";2;4.15;1.00
"Zeile 3";10.40;0.00;0
Pro Zeile möchte ich dann eine StringList mit den Werten der Einzelnen Felder. Als Trennzeichen für die Felder wir das Semikolon ";" verwendet. In einem Feld ist Text durch ein Anführungszeichen markiert. Kommt ein Anführungszeichen im Text vor, ist dieses verdoppelt, wie bei dem String aus Zeile 1.
Kann mir jemand sagen wie eine entsprechende QregExp aussieht um die Strings zu splitten?
kann mir jemand helfen die folgende Strings zu splitten, die zeilenweise eingelesen werden?
"Zeile 1";"Im Text ""Textzeichen"" und Semikolon;";"2010-07-14"; 15
"Zeile 2";2;4.15;1.00
"Zeile 3";10.40;0.00;0
Pro Zeile möchte ich dann eine StringList mit den Werten der Einzelnen Felder. Als Trennzeichen für die Felder wir das Semikolon ";" verwendet. In einem Feld ist Text durch ein Anführungszeichen markiert. Kommt ein Anführungszeichen im Text vor, ist dieses verdoppelt, wie bei dem String aus Zeile 1.
Kann mir jemand sagen wie eine entsprechende QregExp aussieht um die Strings zu splitten?
Zuletzt geändert von Whitefurrows am 18. Juli 2010 20:57, insgesamt 1-mal geändert.
-
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
Nein, leider genügt QStringList QString::split(";") nicht. Weil wenn in einem Text gekennzeichneten Feld wie in Zeile 1 ein Semikolon vorkommt wird zu früh getrennt.
Beispiel für Zeile 1 mit QString::split(";") :
1.) "Zeile 1"
2.) "Im Text ""Textzeichen"" und Semikolon
3.) "
4.) "2010-07-14"
5.) 15
Aussehen soll es aber so:
1.) "Zeile 1"
2.) "Im Text ""Textzeichen"" und Semikolon;"
3.) "2010-07-14"
4.) 15
Ideal wäre es, wenn beim splitten auch gleich die Anführungszeichen für die Kennzeichnung von Textfeldern entfernt werden könnte, damit die Liste dann so aussieht:
1.) Zeile 1
2.) Im Text "Textzeichen" und Semikolon;
3.) 2010-07-14
4.) 15
Beispiel für Zeile 1 mit QString::split(";") :
1.) "Zeile 1"
2.) "Im Text ""Textzeichen"" und Semikolon
3.) "
4.) "2010-07-14"
5.) 15
Aussehen soll es aber so:
1.) "Zeile 1"
2.) "Im Text ""Textzeichen"" und Semikolon;"
3.) "2010-07-14"
4.) 15
Ideal wäre es, wenn beim splitten auch gleich die Anführungszeichen für die Kennzeichnung von Textfeldern entfernt werden könnte, damit die Liste dann so aussieht:
1.) Zeile 1
2.) Im Text "Textzeichen" und Semikolon;
3.) 2010-07-14
4.) 15
-
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
-
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
Leider kann ich die RegExp nicht ändern, weil ich nicht verstehe was sie mach:
("([^"]*|"{2})*"(;|$))|"[^"]*"(;|$)|[^;]+(;|$)|(;)
Kann mir jemand helfen, sie so zu verändern, das ggf. gleich das Anführungszeichen am Anfang und am Ende inklusive Trennzeichen entfernt wird?
Also in der Ersten Zeile
"Zeile 1";"Im Text ""Textzeichen"" und Semikolon;";"2010-07-14"; 15
erhalte ich als erstes
"Zeile 1";
ich möchte aber nur
Zeile 1
Wie muss ich dazu die RegExp ändern?
("([^"]*|"{2})*"(;|$))|"[^"]*"(;|$)|[^;]+(;|$)|(;)
Kann mir jemand helfen, sie so zu verändern, das ggf. gleich das Anführungszeichen am Anfang und am Ende inklusive Trennzeichen entfernt wird?
Also in der Ersten Zeile
"Zeile 1";"Im Text ""Textzeichen"" und Semikolon;";"2010-07-14"; 15
erhalte ich als erstes
"Zeile 1";
ich möchte aber nur
Zeile 1
Wie muss ich dazu die RegExp ändern?
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50
Was ist mit einem Parser gemeint? Die Strings von Hand zu zerlegen? Wüste jetzt nicht wie das viel besser gehen sollte! Ich habe jetzt einfach die RegExp genutzt und dann die Zeichen am Anfang/Ende entfernt und die doppelten Anführungszeichen ersetzt.
Falls jemand versteht wie die RegExp funktioniert, würde ich mich dennoch über eine kurze Erklärung freuen, auch wenn es vielleicht ohne besser geht.
Falls jemand versteht wie die RegExp funktioniert, würde ich mich dennoch über eine kurze Erklärung freuen, auch wenn es vielleicht ohne besser geht.
siehe QRegExp - Hilfe : http://doc.trolltech.com/4.6/qregexp.html#details
Erklärung:
() sind gruppierungen,
(aaa|bb) heisst entweder aaa oder bb
[abcd] entweder a oder b oder c oder d
[^abcd] alles ausser a oder b oder c oder d
^ ist (meistens) der Zeilenanfang es sei denn es ist das erste zeichen in einer [] (s.o.)
$ ist das Zeilenende
Quantifizierung:
{x} ist eine Quantifizierung (== x mal)
* ist eine Quantifizierung (0 bis unendlich = egal wie oft, kann da sein oder auch nicht)
+ ist eine Quantifizierung (1 bis unendlich = mindestens ein mal
Code: Alles auswählen
("([^"]*|"{2})*"(;|$))|"[^"]*"(;|$)|[^;]+(;|$)|(;)
Anführungszeichen
gefolgt von
[optional 0 bis n mal] NICHTanführungszeichen ODER 2 Anführungszeichen
gefolgt von
Anführungszeichen
gefolgt von
Semikolon ODER Stringende
ODER
Anführungszeichen
gefolgt von
[optional 0 bis n mal] NICHTanführungszeichen
gefolgt von
Anführungszeichen
gefolgt von
Semikolon ODER Stringende
ODER
[1 bis n mal] NICHTsemikolon
gefolgt von
Semikolon ODER Stringende
ODER
Semikolon
Erklärung:
() sind gruppierungen,
(aaa|bb) heisst entweder aaa oder bb
[abcd] entweder a oder b oder c oder d
[^abcd] alles ausser a oder b oder c oder d
^ ist (meistens) der Zeilenanfang es sei denn es ist das erste zeichen in einer [] (s.o.)
$ ist das Zeilenende
Quantifizierung:
{x} ist eine Quantifizierung (== x mal)
* ist eine Quantifizierung (0 bis unendlich = egal wie oft, kann da sein oder auch nicht)
+ ist eine Quantifizierung (1 bis unendlich = mindestens ein mal
-
- Beiträge: 138
- Registriert: 1. Mai 2006 19:50