QString::split() mit QregExp [gelöst]

Alles rund um die Programmierung mit Qt
Antworten
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

QString::split() mit QregExp [gelöst]

Beitrag von Whitefurrows »

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?
Zuletzt geändert von Whitefurrows am 18. Juli 2010 20:57, insgesamt 1-mal geändert.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

QStringList QString::split(";") sollte doch langen oder? Zumindest um die Teile die mit einem ";" getrennt sind zu splitten. Den Rest hab ich nicht verstanden.
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

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
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Falls es jemand interessiert ich habe jetzt eine RegExp gefunden mit der es geht und die sieht so aus:

("([^"]*|"{2})*"(;|$))|"[^"]*"(;|$)|[^;]+(;|$)|(;)
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie man sieht sind RegExps nicht immer der Weisheit letzter Schluss - schon gar nicht wenn man sie nur sehr selten benutzt. Schreib einen einfachen Parser - da wärst Du wohl schon längst fertig...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

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.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

siehe QRegExp - Hilfe : http://doc.trolltech.com/4.6/qregexp.html#details

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
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Whitefurrows
Beiträge: 138
Registriert: 1. Mai 2006 19:50

Beitrag von Whitefurrows »

Vielen dank an alle! Die RegExp wurde sehr schön erklärt, hat mir sehr geholfen, Danke!
Antworten