mehrfache Zeichen zu eines reduzieren

Anfängerfragen zum Programmieren mit PureBasic.
der-sigi
Beiträge: 39
Registriert: 07.04.2006 12:22

mehrfache Zeichen zu eines reduzieren

Beitrag 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.

Code: Alles auswählen

Text = ReplaceString(Text,"  "," ")
Bleibt wirklich nichts anderes, als das mit einer Schleife durchzutrödeln?
Danke für den Nachhilfeunterricht. ;)

Viele Grüße
Sigi
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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 :wink:
Zuletzt geändert von mk-soft am 27.04.2006 23:18, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Kiffi,

Können ja mal vergleichen welche schneller ist :allright:

[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 :wink:
Zuletzt geändert von mk-soft am 27.04.2006 23:32, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

mk-soft hat geschrieben:Können ja mal vergleichen welche schneller ist :allright:
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? ;-)
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Kiffi,

dein code ist schneller :allright:
Zuletzt geändert von mk-soft am 27.04.2006 23:34, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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 ^^
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Deeem2031

also, ... Kiffi´s code ist bei meiner maschine immer noch schneller :|

3406 1453 1641
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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")
Zuletzt geändert von ts-soft am 28.04.2006 00:03, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

mk-soft hat geschrieben:@Deeem2031

also, ... Kiffi´s code ist bei meiner maschine immer noch schneller :|

3406 1453 1641
:lol: , ja klar wenn du das mit dem Debugger testest... :freak:
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten