String auseinander nehmen [kompliziert]

Für allgemeine Fragen zur Programmierung mit PureBasic.
Moxl
Beiträge: 150
Registriert: 26.10.2012 13:19

String auseinander nehmen [kompliziert]

Beitrag von Moxl »

Hallo liebe Community,

ich habe wiedermal ein Problem bei dem ich nicht weiter komme.
Aber Vielleicht habt ihr ein paar Tipps und Tricks.

Ich habe einen String der z.B. wie folgt aussieht:

Code: Alles auswählen

alben$="American Idiot2004Dookie1994Revolution Radio2016Nimrod1997
Jetzt möchte ich den String gerne auseinander nehmen, sodass ich mehrere Strings mit den einzelnen Alben habe wie z.B.

Code: Alles auswählen

album1$="American Idiot2004"

Code: Alles auswählen

album2$="Dookie1994"

Code: Alles auswählen

album3$="Revolution Radio2016"

Code: Alles auswählen

album4$="Nimrod1997"
So, die Schwierigkeit bei der Sache ist, dass sich der Inhalt des Strings nicht immer gleich ist. Das einzige was immer gleich bleibt
ist, dass am Ende jeden Albens eine vierstellige Jahreszahl steht. (Welche aber auch immer anders ist)

Habt ihr eine Idee wie man den String trennen kann?
Stehe irgendwie voll auf dem Schlauch :freak:

Vielen Dank schonmal im Vorraus :allright:
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: String auseinander nehmen [kompliziert]

Beitrag von RSBasic »

Warum ist der String so aufgebaut? Kein Trennzeichen vorhanden? Woher bekommst du den String?
Was du machen kannst ist, in einer Schleife jedes Zeichen zu prüfen, ob es ein Buchstabe oder eine Zahl ist. Wenn das vorherige Zeichen eine Zahl war und das nächste Zeichen ein Buchstabe, dann kannst du abtrennen.
Es gibt bestimmt auch eine RegEx-Lösung.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: String auseinander nehmen [kompliziert]

Beitrag von Nino »

Moxl hat geschrieben:Das einzige was immer gleich bleibt ist, dass am Ende jeden Albens eine vierstellige Jahreszahl steht. (Welche aber auch immer anders ist)
Das lässt sich mit einem Regulären Ausdruck einfach lösen:

Code: Alles auswählen

EnableExplicit

Define alben$, rex.i

alben$ = "American Idiot2004Dookie1994Revolution Radio2016Nimrod1997"

rex = CreateRegularExpression(#PB_Any, ".*?\d{4}")

If ExamineRegularExpression(rex, alben$)
   While NextRegularExpressionMatch(rex)
      Debug RegularExpressionMatchString(rex)
   Wend
EndIf
FreeRegularExpression(rex)
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: String auseinander nehmen [kompliziert]

Beitrag von TroaX »

Ich frage mich auch gerade, aus welcher Datenquelle so etwas kommt. Es macht einfach überhaupt keinen auch nur im Ansatz nachvollziehbaren Sinn, Daten auf die Art und Weise abzulegen. Wenn du die Daten selbst auf die Art und Weise ablegst, dann solltest du dir eher darum Gedanken machen, wie du sie besser ablegen kannst. PureBasic unterstützt einige Möglichkeiten, Daten leicht strukturiert abzulegen. Darunter zum einen SQLite, XML und JSON.

Es gibt dafür natürlich auch eine Lösung mit Regulären Ausdrücken. Das müsste jetzt aus dem Kopf so klappen:

Code: Alles auswählen

\D*\d{4}

Code: Alles auswählen

CreateRegularExpression(0, "\D\d{4}")
oder

Code: Alles auswählen

[a-z A-Z]*[0-9]{4}

Code: Alles auswählen

CreateRegularExpression(0, "[a-z A-Z]*[0-9]{4}")
So könnte es gehen:

Code: Alles auswählen

Alben.s = "American Idiot2004Dookie1994Revolution Radio2016Nimrod1997"

If CreateRegularExpression(0, "[a-z A-Z]*[0-9]{4}")
  If ExamineRegularExpression(0, Alben)
    While NextRegularExpressionMatch(0)
      Debug "Album: " + RegularExpressionMatchString(0)
    Wend
  EndIf
Else
  Debug RegularExpressionError()
EndIf
Ausgabe:

Code: Alles auswählen

Album: American Idiot2004
Album: Dookie1994
Album: Revolution Radio2016
Album: Nimrod1997
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: String auseinander nehmen [kompliziert]

Beitrag von Nino »

TroaX hat geschrieben:

Code: Alles auswählen

[a-z A-Z]*[0-9]{4}
Das funktioniert nur für das gegebene Beispiel; aber nicht mehr, sobald ein Albumtitel spezielle Zeichen wie Bindestrich, Anführungszeichen etc. enthält.
\D*\d{4} ist schon besser, funktioniert aber ebenso wie der vorige Reguläre Ausdruck nicht mit Albumtiteln, die außer der obligatorischen Jahreszahl am Ende noch andere Ziffern enthälten.

Ich habe oben einen Regulären Ausdruck genannt, der den gegebenen Bedingungen entspricht:
Moxl hat geschrieben:Das einzige was immer gleich bleibt ist, dass am Ende jeden Albens eine vierstellige Jahreszahl steht. (Welche aber auch immer anders ist)
Zuletzt geändert von Nino am 26.08.2018 16:15, insgesamt 1-mal geändert.
H.Brill
Beiträge: 356
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: String auseinander nehmen [kompliziert]

Beitrag von H.Brill »

oder sogar direkt in ein Array :

Code: Alles auswählen

Define alben$, NbFound.l
alben$ = "American Idiot2004Dookie1994Revolution Radio2016Nimrod1997"
If CreateRegularExpression(0, "[a-z,A-Z ]{1,}[0-9]{1,}")
  Dim Result$(0)
  NbFound = ExtractRegularExpression(0, alben$, Result$())
  For k = 0 To NbFound-1
      Debug Result$(k)
    Next
 Else
    Debug RegularExpressionError()
 EndIf
  
PS : auf das Leerzeichen hinter A-Z achten.
PB 5.60
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: String auseinander nehmen [kompliziert]

Beitrag von Nino »

H.Brill hat geschrieben:PS : auf das Leerzeichen hinter A-Z achten.
Ob mit oder ohne Leerzeichen hinter A-Z: Das funktioniert nicht mehr, sobald ein Albumtitel außer der obligatorischen Jahreszahl am Ende noch andere Ziffern enthält -- oder spezielle Zeichen wie Bindestrich, Anführungszeichen etc.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: String auseinander nehmen [kompliziert]

Beitrag von ccode_new »

Hallo!

Mir gefällt der Zusammenbau der Ausgangszeichenkette überhaupt nicht.

Ich würde dort ein anderes Speicherformat bevorzugen.

Was ist wenn vor der Jahreszahl auch eine Zahl steht und das nachfolgende Album auch wieder mit einer Zahl beginnt ?


Am besten sind auch Alben wie z.B. : "Best of 20.. - 20.."


Dann funktioniert auch der Algo von Nino nicht mehr.
Zuletzt geändert von ccode_new am 26.08.2018 20:19, insgesamt 1-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: String auseinander nehmen [kompliziert]

Beitrag von TroaX »

Nino hat geschrieben:Das funktioniert nur für das gegebene Beispiel; aber nicht mehr, sobald ein Albumtitel spezielle Zeichen wie Bindestrich, Anführungszeichen etc. enthält.
\D*\d{4} ist schon besser, funktioniert aber ebenso wie der vorige Reguläre Ausdruck nicht mit Albumtiteln, die außer der obligatorischen Jahreszahl am Ende noch andere Ziffern enthälten.
Das spielt keine Rolle, da bereits die Datenquelle in seiner Struktur völlig inkonsistent ist und es schlicht viel zu umständlich ist, alle theoretisch aufkommenden Situationen abzudecken. Siehe Beitrag von ccode_new.
Da es sich um Jahreszahlen handelt, könnte man es auch so machen:

Code: Alles auswählen

.*?(19\d\d|20\d\d)
Und wenn Alben aus dem jahr 2020 dort gespeichert werden und die Titel auch wieder mit 2 Ziffern anfangen? Ist zwar noch viel unwahrscheinlicher. Aber trotzdem ist eine vernünftige Datenstruktur eben deutlich besser als das ganze mit regulären Ausdrücken zu zerteilen. Noch dazu will sich mir auch nicht erchließen, warum die Jahreszahl hinter dem Album direkt anschließen muss.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: String auseinander nehmen [kompliziert]

Beitrag von Nino »

TroaX hat geschrieben:
Nino hat geschrieben:Das funktioniert nur für das gegebene Beispiel; aber nicht mehr, sobald ein Albumtitel spezielle Zeichen wie Bindestrich, Anführungszeichen etc. enthält.
\D*\d{4} ist schon besser, funktioniert aber ebenso wie der vorige Reguläre Ausdruck nicht mit Albumtiteln, die außer der obligatorischen Jahreszahl am Ende noch andere Ziffern enthälten.
Das spielt keine Rolle, da bereits die Datenquelle in seiner Struktur völlig inkonsistent ist und es schlicht viel zu umständlich ist, alle theoretisch aufkommenden Situationen abzudecken.
Das spielt sehr wohl eine Rolle. Es stimmt, dass die Daten in ihrer Struktur nicht so sind, dass eine Auftrennung in jedem denkbaren Fall zuverlässig möglich ist. Das ist allerdings kein Grund dafür, absichtlich einen Regulären Ausdruck zu verwenden, der unnötig oft nicht das gewünschte Ergebnis liefert.
Antworten