Seite 1 von 2
mehrfache Zeichen zu eines reduzieren
Verfasst: 27.04.2006 20:09
von der-sigi
Hi
Entschuldigt, wenn ich mit sowas banales daherkomme, aber ich habe keine Info dazu in den Foren noch einen passenden Befehl gefunden. Regex oder so gibt es ja nicht, oder habe ich was übersehen.
Ich möchte mehrfache Leerzeichen in einem String auf jeweils ein Zeichen reduzieren. Folgendes funktioniert nicht.
Bleibt wirklich nichts anderes, als das mit einer Schleife durchzutrödeln?
Danke für den Nachhilfeunterricht. ;)
Viele Grüße
Sigi
Verfasst: 27.04.2006 23:08
von mk-soft
Auch Hi,
*** Bleibt wirklich nichts anderes, als das mit einer Schleife durchzutrödeln? ***
habe mal aus langeweile eine gebastelt.
Code: Alles auswählen
text.s = "Hallo Welt , wie gehts "
neu.s = ""
For i = 1 To Len(text)
If Mid(text, i, 1) = " "
If Not leer
leer = #True
neu + Mid(text, i, 1)
EndIf
Else
leer = #False
neu + Mid(text, i, 1)
EndIf
Next i
Debug ":" + neu + ":"
PB3.9x
Code: Alles auswählen
text.s = "Hallo Welt , wie gehts "
neu.s = ""
For i = 1 To Len(text)
If Mid(text, i, 1) = " "
If leer = #False
leer = #True
neu + Mid(text, i, 1)
EndIf
Else
leer = #False
neu + Mid(text, i, 1)
EndIf
Next i
Debug ":" + neu + ":"
FF

Verfasst: 27.04.2006 23:17
von Kiffi
@mk-soft: 'n büschen kompliziert, oder?
Code: Alles auswählen
Text.s = "Hallo, wie geht's?"
While FindString(Text, " ", 1)
Text = ReplaceString(Text," "," ")
Wend
Debug Text
Grüße ... Kiffi
Verfasst: 27.04.2006 23:20
von mk-soft
@Kiffi,
Können ja mal vergleichen welche schneller ist
[Edit]
Interessantes Ergebnis:
Code: Alles auswählen
time = GetTickCount_()
For n = 1 To 100000
text.s = "Hallo Welt , wie gehts "
neu.s = ""
For i = 1 To Len(text)
If Mid(text, i, 1) = " "
If Not leer
leer = #True
neu + Mid(text, i, 1)
EndIf
Else
leer = #False
neu + Mid(text, i, 1)
EndIf
Next i
Next n
time = GetTickCount_() - time
Debug time
time = GetTickCount_()
For n = 1 To 100000
text.s = "Hallo Welt , wie gehts "
While FindString(Text, " ", 1)
Text = ReplaceString(Text," "," ")
Wend
Next n
time = GetTickCount_() - time
Debug time
3012
1247
FF

Verfasst: 27.04.2006 23:25
von Kiffi
mk-soft hat geschrieben:Können ja mal vergleichen welche schneller ist

dann setzen wir unterschiedliche Prioritäten. Ich lege i. A. mehr Wert auf
Code, den ich auch nach langer Zeit auf Anhieb lesen kann. Da nehme ich die
ein oder andere Millisekunde Zeitverlust gerne in Kauf
Grüße ... Kiffi
P.S.: Verballerst Du mit Deiner Version aufgrund der 3 zusätzlichen Variablen
nicht mehr Speicher?

Verfasst: 27.04.2006 23:34
von mk-soft
@Kiffi,
dein code ist schneller

Verfasst: 27.04.2006 23:34
von Deeem2031
"die ein oder andere Millisekunde" ?
Na dann versuch ma meine Version
Code: Alles auswählen
#r = 100000
time1 = ElapsedMilliseconds()
For ri = 1 To #r
Text.s = "Hallo, wie geht's?"
neu.s = ""
For i = 1 To Len(text)
If Mid(text, i, 1) = " "
If leer = #False
leer = #True
neu + Mid(text, i, 1)
EndIf
Else
leer = #False
neu + Mid(text, i, 1)
EndIf
Next i
Next
time1 = ElapsedMilliseconds() - time1
time2 = ElapsedMilliseconds()
For ri = 1 To #r
Text.s = "Hallo, wie geht's?"
While FindString(Text, " ", 1)
Text = ReplaceString(Text," "," ")
Wend
Next
time2 = ElapsedMilliseconds() - time2
time3 = ElapsedMilliseconds()
For ri = 1 To #r
Text.s = "Hallo, wie geht's?"
*sText.Byte = @Text
*dText.Byte = @Text
Repeat
*dText\b = *sText\b
If *dText\b = ' '
While *sText\b = ' '
*sText+1
Wend
Else
*sText+1
EndIf
*dText+1
Until *sText\b = 0
*dText\b = *sText\b
Next
time3 = ElapsedMilliseconds() - time3
MessageRequester("",Str(time1)+" "+Str(time2)+" "+Str(time3))
P.S. Und ich brauch nur 2 extra Variablen ^^
Verfasst: 27.04.2006 23:40
von mk-soft
@Deeem2031
also, ... Kiffi´s code ist bei meiner maschine immer noch schneller
3406 1453 1641
Verfasst: 27.04.2006 23:50
von ts-soft
Ich hab wieder zu spät angefangen
Code: Alles auswählen
Procedure.s RemoveDSpace(Text.s)
*wert.byte = @Text
Text2.s = Space(Len(Text))
*wert2.byte = @Text2
Repeat
If *wert\b = 32
*wert + 1
*wert2 + 1
While *wert\b = 32
*wert + 1
Wend
EndIf
*wert2\b = *wert\b
*wert + 1
*wert2 + 1
Until *wert\b = 0
*wert2\b = 0
ProcedureReturn Text2
EndProcedure
Debug RemoveDSpace("Feel the ..Pure.. Power")
Verfasst: 28.04.2006 00:02
von Deeem2031
mk-soft hat geschrieben:@Deeem2031
also, ... Kiffi´s code ist bei meiner maschine immer noch schneller
3406 1453 1641

, ja klar wenn du das mit dem Debugger testest...
