collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 97
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 14160
  • stats Beiträge insgesamt: 68645
  • stats Themen insgesamt: 9248
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: Wie viele verschiedene Zeichen hat ein String?  (Gelesen 1639 mal)

Offline pepegoesdigital

  • Newbie
  • Beiträge: 5
Wie viele verschiedene Zeichen hat ein String?
« am: Januar 05, 2019, 17:24:37 »
Hallo allerseits,

ich bin auf der Suche nach einer Lösung, mit der sich zählen läßt, wieviele verschiedene Zeichen ein String enthält.

Also z.B.: "abcccccccdef" gäbe 6. Je einmal a ,b , d, e und f, sowie c (7x, wird allerdings nur einmal gezählt).

Wahrscheinlich habe ich ein Brett vor dem Kopf und finde den richtigen Suchbegriff dafür einfach nicht, aber bisher habe ich nur herausfinden können, wie oft ein spezielles Zeichen oder eine Zeichenkette vorkommt.

Es wäre klasse wenn jemand hier eine Idee hätte.

Herzlichen Dank schonmal vorab.

Viele Grüße
Pepe
« Letzte Änderung: Januar 05, 2019, 17:30:58 von pepegoesdigital »
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 969
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #1 am: Januar 05, 2019, 17:51:31 »
Eine Möglichkeit wäre, die Einzelzeichen in ein Dictionary einzulesen. Da der Key dessen eindeutig bleiben wird, kommt man so zu einer Duplikatsbereinigung. Mit einem Count auf das Ergebnis bekommt man die Anzahl, die Key-Auflistung könnte man bei Bedarf auch bereitstellen.
Sowie: Die Arbeit mit schlanken Objekten wie Dictionary und Collection ist äußerst schnell.
Mit freundlichem Glück Auf!

Eberhard
 

Offline markus888

  • Access-Profi
  • **
  • Beiträge: 257
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #2 am: Januar 05, 2019, 17:56:14 »
vielleicht erklärst du auch wofür so was gut sein soll und ob es um kleine oder große Datenmengen geht.
10 Jahre Access
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 969
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #3 am: Januar 05, 2019, 18:42:42 »
Zitat
ob es um kleine oder große Datenmengen geht
Sollte nicht eine Methode, die sich für große Datenmengen eignet, auch mit Mindermengen hervorragend umgehen können?
Mit freundlichem Glück Auf!

Eberhard
 

Offline markus888

  • Access-Profi
  • **
  • Beiträge: 257
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #4 am: Januar 05, 2019, 19:06:44 »
Zitat
ob es um kleine oder große Datenmengen geht
Sollte nicht eine Methode, die sich für große Datenmengen eignet, auch mit Mindermengen hervorragend umgehen können?

Nicht unbedingt.
Um bei deinen Vergleichen zu bleiben:
Wenn ich mit einem Muldenkipper einen Kübel Sand hole, ist das nicht unbedingt effizient.
Sollte ich aber eine Million Kübel brauchen, schaut die Sache anders aus.
10 Jahre Access
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 969
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #5 am: Januar 05, 2019, 20:12:44 »
Wenn aber der Muldenkipper vom Aufwand/Overhead identisch zum Kübel ist ...? In der IT wird das eher klappen als beim wörtlichen Beispiel.
Mit freundlichem Glück Auf!

Eberhard
 

Offline pepegoesdigital

  • Newbie
  • Beiträge: 5
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #6 am: Januar 06, 2019, 10:19:36 »
@ Eberhard: Ich bin fündig geworden und die Lösung geht in eine der Richtungen, die Du vorgeschlagen hattest (Collection). Danke für den Tip.  :)

@ Markus888: Der Zweck der Funktion ist folgender: Zu Auswertungszwecken liest mein Code Protokollfiles mit jeweils bis 30 Kbyte Text Zeile für Zeile ein und schreibt sie modifiziert woanders hin. Davon gibt es täglich 600 bis 800, also in Summe 8 bis 10 MB Text, der durchlaufen und verarbeitet wird.

Diese Protokollfiles enthalten regelmäßig Trennzeilen, die bspw. nur aus Sternchen, oder Gleichheitszeichen bestehen und für mich nicht interessant sind. Diese stehen meistens in Bereichen, die fast komplett importiert werden sollen.

Leider gibts sonst kein Merkmal, an dem ich sinnvoll festmachen kann, das die Zeile ausgelassen werden soll. Deshalb wollte ich etwas einbauen, was feststellt, das es sich nur um eine Trennzeile handelt, die ignoriert werden kann.

So sieht die Funktion jetzt aus und sie funktioniert ganz gut, ohne die Laufzeit enorm aufzublasen:

Function Uniquecount(TempVar As Variant) As Integer

Dim cUnique As Collection
Dim i As Integer

Set cUnique = New Collection

On Error Resume Next

For i = 1 To Len(TempVar)
    cUnique.Add CStr(Mid(TempVar, i, 1)), CStr(Mid(TempVar, i, 1))
Next i

On Error GoTo 0

Uniquecount = cUnique.Count

End Function

Danke nochmal und viele Grüße.
Pepe
 

Offline markus888

  • Access-Profi
  • **
  • Beiträge: 257
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #7 am: Januar 06, 2019, 11:44:43 »
Hallo Pepe, schön dass du eine Lösung gefunden hast.
Um auf so eine Vorgehensweise zu kommen braucht man ja eine gewisse Kreativität, über die man in
der IT ja unbedingt verfügen sollte. Wenn du nach einigen Monaten oder Jahren den Code wieder ansiehst
wirst du dich dann wundern wie umständlich du das gelöst hast - und das ist gut so.
Alles andere würde bedeuten, dass man sich nicht weiter entwickelt.
10 Jahre Access
 

Offline MzKlMu

  • Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 7535
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #8 am: Januar 06, 2019, 11:46:24 »
Hallo,
ist die Trennzeile nicht immer gleich, also mit den gleichen Zeichen aufgebaut ?
Und eigentlich sollte es immer die gleiche Anzahl zeichen sein.
Ich kann mir nicht vorstellen, dass die Trennzeichen willkürlich sind und auch noch variieren können.
Der Aufbau der Protokollfiles muss doch Regeln unterliegen.
« Letzte Änderung: Januar 06, 2019, 11:57:48 von MzKlMu »
Gruß
Klaus
 

Offline markus888

  • Access-Profi
  • **
  • Beiträge: 257
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #9 am: Januar 06, 2019, 11:59:13 »
Wenn aber der Muldenkipper vom Aufwand/Overhead identisch zum Kübel ist ...? In der IT wird das eher klappen als beim wörtlichen Beispiel.

Im Grunde hast du natürlich recht. Wollte nur auch mal so schöne Vergleiche machen wie du es tust.  ;D
Allerdings stimmt das für VBA, wenn es um Textverarbeitung geht, da die viele Funktionen sehr langsam arbeiten.
Um das zu beschleunigen, hat man einen hohen Overhead. Dadurch ist die Verarbeitung bei kurzen Texten langsamer
wie die VBA Funktionen, bei langen dann aber um Faktor 10 bis N schneller.

Vor einigen Wochen gabs ja mal die Herausforderung festzustellen, ob eine Ziffer mehr als 3 mal in einer Los Nummer vorkommt.
Da hat dann der Josef P. mittels like "*0*0*0*0*" gesucht und das für jede Ziffer.
Das war dann gleich schnell wie ein wesentlich besserer VBA Code von Nouba.
Da wußte ich, dass es keinen Sinn macht in VBA Performance zu erhoffen.
Damals habe ich begonnen DLL Funktionen für VBA zuerst in C und dann in Delpi zu schreiben und siehe da,
damit läuft alles um ein vielfaches schneller und ist im Grunde einfacher zu programmieren wie in VBA.

Vielleicht kann ich dir damit auch den Blick auf andere Techniken schmackhaft machen.  :)
10 Jahre Access
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 969
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #10 am: Januar 06, 2019, 12:23:56 »
Die Frage, ob die Datenmenge niedrig oder hoch ist, würde sich mir weniger stellen als die Frage, ob solch ein Vorgang einmalig ausgeführt wird oder ob er sich mit den vorhandenen Daten mehr-/vielfach wiederholt. Im letzteren Fall würde man an Normalisierung denken, also die Stringaufteilung einmalig vornehmen und in einer Tabelle abspeichern, also etwa AusdruckID, ASCII-Code als Byte, evtl. Positionsnummer als Int/Long.

Für einmalige Verarbeitung hätte ich den Ansatz, woraus man eine Funktion gießen könnte:
Sub CountCharacters()
    Static dicCC As Object
    Dim vArr As Variant
    Dim sChar As String
    Dim i As Long
    Const cText = "abcccccccdef"

    If dicCC Is Nothing Then
        Set dicCC = CreateObject("Scripting.Dictionary")
    End If


'    ' ohne Auswertung Häufigkeit
'    With dicCC
'        For i = 1 To Len(cText)
'            sChar = Mid$(cText, i, 1)
'            dicCC(sChar) = sChar
'        Next
'    End With

    With dicCC
        For i = 1 To Len(cText)
            sChar = Mid$(cText, i, 1)
            If .Exists(sChar) Then
                .Item(sChar) = .Item(sChar) + 1
            Else
                .Add sChar, 1
            End If
        Next

        ' Auswertung
        Debug.Print "Anzahl Elemente: " & .Count
        vArr = .Keys
        For i = 0 To UBound(vArr)
            Debug.Print "Element" & i + 1 & ": " & vArr(i)
        Next
        vArr = .Items
        For i = 0 To UBound(vArr)
            Debug.Print "Häufigkeit von Element" & i + 1 & ": " & vArr(i)
        Next

        .RemoveAll
    End With
End Sub
@markus: Das Ausweichen auf eine effizientere Sprache wäre auch ein Weg, allerdings hat man da auch Overhead, der sich erst einmal lohnen muss.
Ein Weg ist natürlich auch, zuerst Abläufe zu optimieren, also eine Schleife nur genau einmal zu durchlaufen, Prüfungen in Anzahl gering halten, Direktzugriffe verwenden, Massendatenverarbeitung wo sinnvoll und möglich, Objekte wie Collection oder Dictionary oder andere nicht wie ein Lämmerschwanzwackeln auf- und zumachen, sondern das eine Objekt richtig zu nutzen, speicherarm zu arbeiten usw.

Zitat
Allerdings stimmt das für VBA, wenn es um Textverarbeitung geht, da die viele Funktionen sehr langsam arbeiten.
Ggf. ist da nicht mal VBA selber schuld, sondern die Umsetzung seitens Microsoft (man kann es kaum glauben).
Beispiel Blitzschnelle Replace-Funktion:
Zitat von: Jost Schwider
Man beachte, dass die hier vorgestellte Funktion deutlich schneller als die in VB6 eingebaute Funktion ist, da keine "teuren" Zeichenketten-Funktionen verwendet werden, sondern ausschließlich das wenig bekannte Mid$-Statement.
Da kann man nachdenklich werden ...
Mit freundlichem Glück Auf!

Eberhard
 

Offline markus888

  • Access-Profi
  • **
  • Beiträge: 257
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #11 am: Januar 06, 2019, 12:41:56 »
Lieber Eberhard.

Ich gehe ganz bewusst nicht auch die Problematik ein.
Es geht auch nicht darum um wie viel man den Code noch optimieren könnte.

Die Codes von Jost Schwider kenne ich.
Teilweise ganz gut teilweise schlecht. Die habe ich selbst sicher weit besser umgesetzt.
Außerdem vergleicht er die Geschwindigkeit mit einer vb6.exe.
Die ist immer um ein vielfaches schneller wie VBA.

Mid$ ist vergleichsweise um Faktor 30 langsamer wie wenn ich in c oder Delhi mit einem Pointer arbeite.
Du verstehst vermutlich auch nicht warum, weil dir die Grundlagen (noch) fehlen, was im Hintergrund ungefähr abgeht.
Deshalb sehe ich auch keinen Sinn in einer Diskussion, weil ich nie das Gefühl habe, dass du etwas lernen,
sondern nur rechthaben willst (was grundsätzlich ja positiv ist).

Da du dich aber in VBA recht gut auskennst, rate ich dir dazu deinen Horizont zu erweitern, du wirst es nicht bereuen!!  ;D

10 Jahre Access
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 252
    • Code-Bibliothek für Access-Entwickler
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #12 am: Januar 06, 2019, 13:03:48 »
Hallo!

Ich will zusätzlich noch die Gedanken weg von VBA-Code in Richtung Datenverarbeitung lenken.
Wenn pro Tag 10MB Text verarbeitet werden und Access dafür genutzt wird, stellt sich für mich die Frage, warum man keine Tabellen für die Verarbeitung von Daten verwenden sollte.
Doppelte Datensätze sind per SQL sehr einfach zu finden.
Ich hab auch den Eindruck, dass die eigentliche Anforderung ("Zeilen auslassen" => Datensätze auslassen/löschen) etwas von der Ausgangssitation aus Beitrag 1 abweicht .

Was wäre, wenn man in eine Hilfstabelle erstmal alle Zeilen einliest und danach die Daten per SQl aufbereitet?

Anm.: Wenn von Access nur VBA genutzt werden soll, halte ich den Einsatz von Access als überdenkenswert.

mfg
Josef


Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 969
Re: Wie viele verschiedene Zeichen hat ein String?
« Antwort #13 am: Januar 06, 2019, 13:11:47 »
Zitat
weil ich nie das Gefühl habe, dass du etwas lernen,
sondern nur rechthaben willst

Vielen Dank für die Blumen.

Für die "neuen Wege" würde ich dann eine Notwendigkeit sehen, wenn ich diese in einem konkreten Fall für mich benötigen (können) würde. Wenn man bis dahin mit durchdachten Abläufen und beherrschter Haustechnik auch hinkommt, ist das doch auch in Ordnung, und bezüglich Zeit für Entwicklung dürfte man im Vorteil sein - unbeachtet des Spassfaktors, den man versäumt.

Man darf es ruhig konservativ nennen, wenn man in einer Datenbank nicht Feuerwerke in VBA oder  über andere externe Sprachen abbrennen will, sondern sich erst einmal in der nativen Technik wie SQL bewegen wird.

Ich bin auch ein Freund von RegEx. Allerdings, wenn ich das brauche, wurde bei Verwendung in einer Datenbank im Vorfeld etwas falsch gemacht.

Ich bin sehr nahe an dem, was Josef ergänzt hat.
Mit freundlichem Glück Auf!

Eberhard
 

 

zu viele Daten ?

Begonnen von jeep_66Board Tabelle/Abfrage

Antworten: 21
Aufrufe: 14372
Letzter Beitrag Mai 10, 2010, 09:59:03
von DF6GL
verschiedene Textfarben in einem Feld ???

Begonnen von carman0103Board Formular

Antworten: 2
Aufrufe: 2822
Letzter Beitrag Juni 08, 2010, 09:28:56
von carman0103
Kriterium Anzahl der Zeichen

Begonnen von OPSBoard Tabelle/Abfrage

Antworten: 3
Aufrufe: 11543
Letzter Beitrag Juli 27, 2010, 13:45:42
von OPS
Ersetzen von mehreren Zeichen in einer Spate

Begonnen von perlunaBoard Tabelle/Abfrage

Antworten: 2
Aufrufe: 2318
Letzter Beitrag August 11, 2010, 10:30:48
von perluna
Zeichen aus txt-Datei auslesen

Begonnen von liedersternBoard Access Programmierung

Antworten: 8
Aufrufe: 4189
Letzter Beitrag August 17, 2010, 12:34:08
von liederstern