vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

In diesem Forum haben Sie die Möglichkeit Kommentare, Fragen und Verbesserungsvorschläge zu den im vb@rchiv gelisteten Tipps und Workshops zu posten.

Hinweis:
Ein neues Thema kann immer nur über die jeweilige Tipps & Tricks bzw. Workshop Seite eröffnet werden!

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fragen zu Tipps & Tricks und Workshops im vb@rchiv
Tipp 2215: Doppelte Zeichen aus einem String entfernen 
Autor: Dirk
 Tipp anzeigenDatum: 13.10.10 10:29

Bitte mal testen mit:
s = String(2, "a"), nebst sResult = StripDuplicates(s, "A"), viel Spaß im Nirvana

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: ModeratorDieter (Moderator)
Datum: 13.10.10 10:35

Upps... stimmt: hab' den Code soeben angpasst. Danke.

_________________________
Professionelle Entwicklerkomponenten
www.tools4vb.de

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: Dirk
Datum: 13.10.10 10:38

Mein Vorschlag dafür:
Private Function StripDuplicates( _
    ByVal vValue As String, _
    Optional ByVal vChar As String = " " _
  ) As String
 
  Dim sResult As String
  Dim lenValue As Long
  Dim s As String
  lenValue = Len(vValue)
 
  sResult = vbNullString
  If lenValue > 0 Then
 
    Dim i As Long
    Dim pos As Long
 
    'Platz schaffen, wir wollen nicht "konkatenieren"
    sResult = String(lenValue, " ")
 
    ' i: index in s
    i = 1
    ' pos: index im result, wird nur erhöht, wenn geschrieben wird
    pos = 0
 
    'Wir laufen nur 1-Mal durch den gesamten String!
    Do While i <= lenValue
 
      s = Mid$(vValue, i, 1)
 
      pos = pos + 1
      Mid$(sResult, pos, 1) = s
 
      If s = vChar Then
 
        'skip redundante Zeichen
        Do Until Mid$(vValue, i + 1, 1) <> vChar
          i = i + 1
        Loop
 
      End If
      i = i + 1
 
    Loop
 
  End If
 
  StripDuplicates = Trim$(sResult)
 
End Function
Edit: Typo

Gruß
Dirk

--
?Get it right the first time

Beitrag wurde zuletzt am 13.10.10 um 10:40:15 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: Dirk
Datum: 13.10.10 10:48

Mhm, mit:

"RDenKbRUDrsqyrEhKSJjPfAlCCoPrRGvNeKVqxJeKPwHWRAkblqUTpFPiHfXUjFxPyYTnjNTsVUdlbAoDnpQDTUdVGBGfOehgnnWhqZzLhfwaazIyxbKDQnsWbWFIHbOUZbTISllXeBzZOsGVrWtAiGVtuKJjPqGniIxxQwuimBbMrbw wuEcZU vmoGsoSYtrDzhlynCiBRZOutWqRgSoXXkeclQhCeubgNxhoensWIqduNRyHPCeL UAwnlup"

und "A" als Parameter klappts auch nicht so recht ...

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: Dirk
Datum: 13.10.10 10:52

Hier mal mein Testframework, xt ist ein Highperformance-Counter, müsstest du auskommentieren.

Option Explicit
 
Private Declare Sub DEBUGPRINT Lib "kernel32" Alias _
  "OutputDebugStringA" ( _
      ByVal lpOutputString As String _
    )
 
Private m_CharTable As String
 
Private Sub cmdRun_Click()
 
  doTest
 
End Sub
 
Private Sub Form_Load()
 
  Me.Show
  Init
 
End Sub
 
Private Sub doTest()
 
  Dim i As Long
  Dim s As String
  Dim sResult As String
 
  Dim sChar As String
  Dim lenTable As Long
  Dim iTblIdx As Long
 
  Dim cnt As Long
 
  InitRnd 1
 
  s = CreateRandomString(255)
  cnt = Val(txtRuns)
  lenTable = Len(m_CharTable)
 
  Dim xt As xTimer
  Set xt = New xTimer
  xt.Calibrate
 
  DEBUGPRINT "DBGVIEWCLEAR"
 
  xt.Start
  For i = 1 To cnt
 
    iTblIdx = i Mod lenTable
    If iTblIdx = 0 Then iTblIdx = 3
    sChar = Mid$(m_CharTable, iTblIdx, 1)
 
    sResult = StripDuplicates(s, sChar)
 
    DEBUGPRINT "[" & CStr(Len(s)) & "] " & s
    DEBUGPRINT "[" & CStr(Len(sResult)) & "] " & sResult
 
    If i Mod 50 = 0 Then DoEvents
 
  Next i
  xt.Halt
  lblRes1.Caption = CStr(xt.RunTime)
 
  xt.Start
  For i = 1 To cnt
 
    iTblIdx = ((i + 1) Mod lenTable) + 1
    sChar = Mid$(m_CharTable, iTblIdx, 1)
 
    sResult = StripDuplicates1(s, sChar)
 
    DEBUGPRINT "[" & CStr(Len(s)) & "] " & s
    DEBUGPRINT "[" & CStr(Len(sResult)) & "] " & sResult
 
    If i Mod 50 = 0 Then DoEvents
 
  Next i
  xt.Halt
  lblRes2.Caption = CStr(xt.RunTime)
 
End Sub
 
Private Sub Init()
 
  InitCharTable
  InitRnd 1
 
  txtRuns = 1000
 
End Sub
 
Private Sub InitRnd(Optional ByVal vInitVal As Long)
 
  If IsMissing(vInitVal) Then
    Randomize Timer
  Else
    Rnd -1
    Randomize vInitVal
  End If
 
End Sub
 
Private Function StripDuplicates1( _
    ByVal vValue As String, _
    Optional ByVal vChar As String = " " _
  ) As String
 
  Dim sResult As String
  Dim lenValue As Long
  Dim s As String
  lenValue = Len(vValue)
 
  sResult = vbNullString
  If lenValue > 0 Then
 
    Dim i As Long
    Dim pos As Long
 
    'Platz schaffen, wir wollen nicht "konkatenieren"
    sResult = String(lenValue, " ")
 
    ' i: index in s
    i = 1
    ' pos: index im result, wird nur erhöht, wenn geschrieben wird
    pos = 0
 
    'Wir laufen nur 1-Mal durch den gesamten String!
    Do While i < lenValue
 
      s = Mid$(vValue, i, 1)
 
      pos = pos + 1
      Mid$(sResult, pos, 1) = s
 
      If s = vChar Then
 
        'skip redundante Zeichen
        Do Until Mid$(vValue, i + 1, 1) <> vChar
          i = i + 1
        Loop
 
      End If
      i = i + 1
 
    Loop
 
  End If
 
  StripDuplicates1 = Trim$(sResult)
 
End Function
 
' Entfernt mehrfach vorkommende Zeichen(-ketten) aus einem String
Public Function StripDuplicates(ByVal Value As Variant, _
  Optional ByVal sChar As String = " ") As Variant
 
  If IsNull(Value) Then
    StripDuplicates = Null
  Else
    If Value = LCase$(String$(Len(Value), sChar)) Then
      Value = sChar
    Else
      While Len(Value) > 0 And InStr(1, Value, sChar & sChar, vbTextCompare) > 0
        Value = Replace(Value, sChar & sChar, sChar)
      Wend
    End If
    StripDuplicates = Value
  End If
End Function
 
Private Function rndChar() As String
 
  Dim lenTable As Long
 
  lenTable = Len(m_CharTable)
  rndChar = Mid$(m_CharTable, Int((lenTable - 1 + 1) * Rnd + 1), 1)
 
End Function
 
Private Sub InitCharTable()
 
  Dim i As Long
  Dim j As Long
 
  m_CharTable = String(255, " ")
 
  j = 1
  For i = Asc("A") To Asc("Z")
    Mid$(m_CharTable, j, 1) = Chr$(i)
    j = j + 1
  Next i
 
  Mid$(m_CharTable, j, 1) = " "
  j = j + 1
 
  For i = Asc("a") To Asc("z")
    Mid$(m_CharTable, j, 1) = Chr$(i)
    j = j + 1
  Next i
 
  m_CharTable = Trim$(m_CharTable)
 
End Sub
 
Private Function CreateRandomString(ByVal vLen As Long) As String
 
  Dim i As Long
  Dim sResult As String
 
  sResult = String(vLen, " ")
 
  For i = 1 To vLen
    Mid$(sResult, i, 1) = rndChar()
  Next i
 
  sResult = Trim$(sResult)
  CreateRandomString = sResult
 
End Function
 
Private Sub txtRuns_Change()
 
  Static prev As String
 
  If Not IsNumeric(txtRuns) Then
    txtRuns = prev
  Else
    prev = txtRuns
  End If
 
End Sub

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: Dirk
Datum: 13.10.10 10:53

Die Formular-Elemente:
VERSION 5.00
Begin VB.Form Form1 
   BorderStyle     =   3  'Fixed Dialog
   Caption         =   "Form1"
   ClientHeight    =   2385
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   3780
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   2385
   ScaleWidth      =   3780
   ShowInTaskbar   =   0   'False
   StartUpPosition =   3  'Windows Default
   Begin VB.CommandButton cmdRun 
      Caption         =   "Run"
      Height          =   375
      Left            =   240
      TabIndex        =   4
      Top             =   1800
      Width           =   3255
   End
   Begin VB.TextBox txtRuns 
      Height          =   285
      Left            =   1920
      TabIndex        =   3
      Text            =   "1000"
      Top             =   360
      Width           =   1575
   End
   Begin VB.Label lblRes2 
      BackColor       =   &H80000018&
      BorderStyle     =   1  'Fixed Single
      Height          =   375
      Left            =   1920
      TabIndex        =   6
      Top             =   1260
      Width           =   1575
   End
   Begin VB.Label lblRes1 
      BackColor       =   &H80000018&
      BorderStyle     =   1  'Fixed Single
      Height          =   375
      Left            =   1920
      TabIndex        =   5
      Top             =   780
      Width           =   1575
   End
   Begin VB.Label lblResult2 
      Alignment       =   1  'Right Justify
      Caption         =   "Result Dirk:"
      Height          =   255
      Left            =   360
      TabIndex        =   2
      Top             =   1320
      Width           =   1335
   End
   Begin VB.Label lblResult1 
      Alignment       =   1  'Right Justify
      Caption         =   "Result Dieter:"
      Height          =   255
      Left            =   360
      TabIndex        =   1
      Top             =   840
      Width           =   1335
   End
   Begin VB.Label lblRuns 
      Alignment       =   1  'Right Justify
      Caption         =   "Runs:"
      Height          =   255
      Left            =   360
      TabIndex        =   0
      Top             =   360
      Width           =   1335
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: Dirk
Datum: 13.10.10 11:07

Upps: Die Zeile
    iTblIdx = ((i + 1) Mod lenTable) + 1
muss natürlich durch:
    iTblIdx = i Mod lenTable
    If iTblIdx = 0 Then iTblIdx = 3
ersetzt werden.

Außerdem hier noch noch der Fehler:
'Wir laufen nur 1-Mal durch den gesamten String!
    Do While i < lenValue
was heißen muss:
'Wir laufen nur 1-Mal durch den gesamten String!
    Do While i <= lenValue
Dieser Bug ist aber in dem geposteten Vorschlag bereits korrigiert - sorry!

Gruß
Dirk

--
?Get it right the first time

Beitrag wurde zuletzt am 13.10.10 um 11:21:21 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: Rollator
Datum: 05.11.10 18:42

Hallo Dirk,

StripDuplicates = Trim$(sResult)

löscht automatisch alle Leerzeichen vorne und hinten! Ein Leerzeichen ist aber erlaubt, selbst wenn der Löschwunsch sich auf doppelte Leerzeichen bezieht.

Exakter ist daher

StripDuplicates = Left$(sResult, pos)

In diesem Sinne
der
Rollator
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Doppelte Zeichen aus einem String entfernen 
Autor: Rollator
Datum: 05.11.10 19:08

Hallo Herr Otter,

warum arbeiten Sie in diesem Tipp stets mit dem Typ Variant, obwohl es sich doch hier nur um Strings handeln kann?

Darüber hinaus glaube ich, dass die instr Function einige Sonderfälle sowieso korrekt behandelt, so dass eine zusätzliche Abfrage eigentlich nicht sein müsste?

Ansonsten will man häufiger auch, dass "bB" durch "b" (oder "B") ersetzt wird, der Ansatz könnte dann z.B. so aussehen:


Function ReplaceDouble _
         (ByVal Text As String, ByRef Such As String, _
                         suchArt As VbCompareMethod) As String
 
        ' TKurz = ReplaceDouble("abBbcbbb", "b", vbTextCompare)
        ' entfernt so doppelte "b" aber auch "bB" -> "abcb"
 
        ' TKurz = ReplaceDouble(" b   bb", " ", vbBinaryCompare)
        ' entfernt so doppelte " " -> " b bb"
 
         Dim DoppelSuch As String
 
         If LenB(Such) > 0 Then
 
            DoppelSuch = Such + Such
 
            Do While InStr(1, Text, DoppelSuch, suchArt) > 0
               Text = Replace(Text, DoppelSuch, Such, 1, -1, suchArt)
            Loop
 
         End If
 
         ReplaceDouble = Text
End Function
 
 
Sub ReplaceDoubleSub _
   (ByRef Text As String, ByRef Such As String, suchArt As VbCompareMethod)
 
        ' Aufruf als Sub geht oft etwas schneller 
        ' T = "abBbcbbb" : ReplaceDoubleSub T, "b", vbTextCompare
        ' entfernt so doppelte "b" aber auch "bB" -> "abcb"
 
        ' T = " b   bb"  : ReplaceDoubleSub T, " ", vbBinaryCompare
        ' entfernt so doppelte " " -> " b bb"
 
         Dim DoppelSuch As String
 
         If LenB(Such) > 0 Then
 
            DoppelSuch = Such + Such
 
            Do While InStr(1, Text, DoppelSuch, suchArt) > 0
               Text = Replace(Text, DoppelSuch, Such, 1, -1, suchArt)
            Loop
 
         End If
 
End Sub
Viele Grüße
Rollator
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel