(unbekannte) Sonderzeichen zählen (ArrayList)

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von MB76.

    (unbekannte) Sonderzeichen zählen (ArrayList)

    Hallo zusammen,

    folgende Problemstellung:

    Ich habe ein Programm geschrieben, welches in einer exteren Textdatei alle Sonderzeichen ermittelt und diese in eine ArrayList speichert (jedes nur 1x):
    (identifiziertes Sonderzeichen = match.value)

    VB.NET-Quellcode

    1. Public gefundene_Sonderzeichen As New ArrayList
    2. '.....
    3. Dim vorhanden As Boolean = False
    4. Dim Eintrag As String = "'" & match.Value & "' /ASCII: " & AscW(match.Value)
    5. For Each Item As String In gefundene_Sonderzeichen
    6. If Item = Eintrag Then vorhanden = True
    7. Next
    8. If vorhanden = False Then
    9. gefundene_Sonderzeichen.Add(Eintrag)
    10. End If


    Nun suche ich nach einer Möglichkeit, die ANZAHL von jedem (vorher nicht bekannten) Sonderzeichen zu zählen. Also im Prinzipt zu jedem ArrayList-Eintrag noch eine zweite Dimension hinzufügen, die hochgezählt wird.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MB76“ ()

    VB.NET-Quellcode

    1. Friend Function SucheAnzahl(ByVal zuSuchen As String, ByVal zuDurchsuchen As String) As Count
    2. Dim regex As New System.Text.RegularExpressions.Regex(zuDurchsuchen)
    3. Return regex.Matches(zuSuchen).Count
    4. End Function


    sowas?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    EaranMaleasi schrieb:

    Bastel dir eine kleine Klasse, die lediglich die Properties Sonderzeichen und Count besitzt. Wird ein Sonderzeichen gefunden, erzeugst du ein neues Objekt, setzt die beiden Properties dieser Klasse und schreibst sie in eine List(Of DeineKlasse).


    DANKE. Genau das war wohl das Stichwort auf das ich (als fast-noch-Anfänger) nicht gekommen bin ;)

    MB76 schrieb:

    Ich lese die Datei ZEICHENweise ein
    Das ist suboptimal.
    Sieh Dir mal diesen Code an:

    VB.NET-Quellcode

    1. Dim txt = IO.File.ReadAllText("DEINE_DATEI") ' die ganze Datei einlesen
    2. Dim indexStart As Integer = 0 ' Index, von dem an gesucht wird
    3. Dim dct As New Dictionary(Of Char, Integer) ' Ziel-Daten aufbauen
    4. dct.Add("ä"c, 0) ' alle Deine Sonderzeichen hinzufügen
    5. dct.Add("ö"c, 0)
    6. dct.Add("ü"c, 0)
    7. Do
    8. Dim index = txt.IndexOfAny(New Char() {"ä"c, "ö"c, "ü"c}, indexStart) ' Index des nächsten Sonderzeichens holen
    9. If index < 0 Then
    10. Exit Do ' feddich
    11. End If
    12. Dim c = txt(index) ' Zeichen an Position auslesen
    13. dct(c) += 1 ' dessen Anzahl erhöhen
    14. indexStart = index + 1 ' weitere Suche ab dem nächsten Zeichen
    15. Loop
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    a) kann die einzulesende Datei durchaus sehr groß sein (deswegen zeichenweise)
    b) sind die Sonderzeichen bei der Programmierung UNBEKANNT, sodass ich diese nicht hinterlegen kann (Sonderzeichen ist in dem Fall alles, was nicht auf einer "whitelist" steht)

    MB76 schrieb:

    UNBEKANNT
    Ja und? Da bauen wir halt die Information dynamisch auf.
    Die Datei kann man auch zeilenweise einlesen und abarbeiten.

    VB.NET-Quellcode

    1. For Each line In IO.File.ReadLines("DEINE_DATEI")
    2. ' tue alles mit der aktuell eingelesenen Zeile
    3. Next

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Information

    MB76 schrieb:

    XML ohne Zeilenumbrüche
    kommt bereits im 10. Post. Alle Achtung. :rolleyes:
    Also.
    Schreib mal bitte eine vollständige und belastbare Problembeschreibung auf.
    Das bedeutet, dass ein späterer Post von Dir mit einem Satz wie "Das hab ich so nicht gemeint" oder "Das ist doch völlig anders" oder "ja da war doch noch" keinerlei Bedeutung hat.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hatte doch direkt geschrieben, dass ich ZEICHENweise auslese?! Meine Frage war nicht ob das sinnvoll ist oder nicht! Also nochmal:

    - ich lese ZEICHENweise eine Textdatei aus (warum wieso weshalb ist für die Fragestellung völlig unerheblich)
    - wenn ich hierbei ein Zeichen finde, welches nicht auf einer definierten Whitelist ist, füge ich dieses in eine Arraylist ein (falls nicht schon in dieser vorhanden)
    - Problem: ich würde gern zählen, wie oft ich jedes der Sonderzeichen gefunden habe

    möglicher Lösungsansatz: ich füge ein gefundenes Sonderzeichen IMMER in die Arraylist und zähle im Anschluss daraus die Häufigkeit aus.
    Wo ist eigentlich das Problem?
    Dann liest du sie eben zeichenweise ein, prüfst, ob das Zeichen auf der Whitelist ist. Wenn nein, dann prüfst du, ob das Zeichen schon im dict As New Dictionary(Of Char, Integer) existiert (Dict.ContainsKey(zeichen)). Wenn ja, erhöhst du die Anzahl (dict(zeichen)+=1, wenn nicht, fügst es mit dict.Add (zeichen, 0)dazu.

    MB76 schrieb:

    ich lese ZEICHENweise eine Textdatei aus (warum wieso weshalb ist für die Fragestellung völlig unerheblich)
    Falsche Herangehensweise.
    Ich soll alle Zeichen in einer Datei ... auf ihre Zugehörigkeit zur Gruppe {bla} hin überprüfen und die Anzahl ihres Vorkommens ermitteln.
    Korrekt so?
    Können wir nun weitermachen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Falsche Herangehensweise.

    Sehe ich nicht so. Beispiel: Ich gehe in die KFZ-Werkstatt und sage dass mein Motor kaputt ist und dieser repariert werden soll. Da ist die Information, dass ich das Auto dazu verwenden möchte um von Berlin nach München zu fahren völlig sinnfrei...

    Ich teste jetzt mal die Dictionary-Methode. Besten Dank für den Tipp!

    MB76 schrieb:

    völlig sinnfrei
    Korrekt.
    Ich habe Information rausgenommen, um zum Kern der Sache zu kommen.
    Du packst zusätzliche Information rein, womit die Sache unnötig verkompliziert wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!