Groß-/Kleinschreibung automatisiert

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Groß-/Kleinschreibung automatisiert

    Hallo,

    ich habe ein Reihe an großgeschriebenen Worten und Zeichenkombinationen: "TEST WORT 45%$ STRING"
    und ich möchte daraus die Schreibweise korrigieren: "Test Wort 45%$ String"
    Die Wörter beginnen immer mit einem Großbuchstaben. Nicht-Wörter beinhalten keine Buchstaben.

    VB.NET-Quellcode

    1. Private Function CaseWords(input as String) as String
    2. Dim worte = input.Split(" "c)
    3. For i = 0 To worte.Count - 1
    4. Dim hold = worte(i).ToLower.ToCharArray
    5. hold(0) = Char.ToUpper(hold(0))
    6. worte(i) = New String(hold)
    7. Next
    8. Return String.Join(" "c, worte)
    9. End Function


    Bin für Verbesserungen dankbar

    Viele Grüße

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    @Haudruferzappeltnoch Ich denke mal, Du hast eine sehr kurze Lösung gefunden.
    Ich hab probiert, den String als Ganzes anzugehen, um das Split zu ersparen,
    das geht möglicherweise schneller, ist aber etwas länger:

    VB.NET-Quellcode

    1. Private Function CaseWords(input As String) As String
    2. Dim input2 = input.ToLower().ToCharArray()
    3. input2(0) = Char.ToUpper(input2(0))
    4. Dim last = 0 ' Start
    5. Do While (True)
    6. last = input.IndexOf(" "c, last) ' Index des jeweils nächsten Leerzeichens
    7. If last < 0 OrElse last >= input.Length - 1 Then
    8. Exit Do
    9. End If
    10. last += 1 ' Index des großzuschreibenden Zeichens nach dem Leerzeichen
    11. input2(last) = Char.ToUpper(input2(last))
    12. Loop
    13. Return New String(input2)
    14. End Function
    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!
    Hallo,
    schade, dass man unter VB nicht mit Spans arbeiten kann, denn unter C# wäre folgendes machbar. Das ist zwar viel Code, aber effektiv :)

    C#-Quellcode

    1. public string CaseWords1(string input)
    2. {
    3. return string.Create(input.Length, input, (s, v) => {
    4. var t = v.AsSpan();
    5. bool isNewWord = true;
    6. int currentIndex = 0;
    7. for (int i = 0; i < t.Length; ++i)
    8. {
    9. switch (t[i])
    10. {
    11. case >= (char)65 and <= (char)90:
    12. s[currentIndex] = isNewWord ? t[i] : (char)(t[i] + 32);
    13. break;
    14. case >= (char)97 and <= (char)122:
    15. s[currentIndex] = isNewWord ? (char)(t[i] - 32) : t[i];
    16. break;
    17. case (>= (char)48 and <= (char)57) or (char)32:
    18. s[currentIndex] = t[i];
    19. break;
    20. default:
    21. --currentIndex;
    22. break;
    23. }
    24. isNewWord = t[i] == ' ';
    25. ++currentIndex;
    26. }
    27. });
    28. }


    TextInfo.ToTitleCase bringt nicht das gewünschte Ergebnis vom OP, ist aber sicherlich die kürzeste Möglichkeit.
    Einfach aus Interesse habe ich die gezeigten Möglichkeiten mal gebechmarkt. Vielleicht interessiert es euch ja auch:
    Spoiler anzeigen

    Brainfuck-Quellcode

    1. | Method | Mean | Error | StdDev | Gen0 | Allocated |
    2. |------------------ |----------:|----------:|----------:|-------:|----------:|
    3. | CaseWords1 | 98.16 ns | 2.065 ns | 5.180 ns | 0.0153 | 64 B |
    4. | CaseWordsHauDrauf | 518.05 ns | 15.979 ns | 46.612 ns | 0.1411 | 592 B |
    5. | CaseWordsRFG | 159.73 ns | 3.280 ns | 8.697 ns | 0.0477 | 200 B |
    6. | CaseWordsDksksm | 458.22 ns | 13.734 ns | 38.738 ns | 0.0801 | 336 B |

    CultureInfo ist perfekt. Kleiner Bonuseffekt "TEST-WORT" wird zu "Test-Wort"; bei den anderen Codes würde da "Test-wort" rauskommen.
    Hatte für mich zwar keine Relevanz, aber trotzdem gut. Und vor allem ist die Funktion dann unmissverständlich.

    @ISliceUrPanties Oder welche Fälle siehst du dort fehlschlagen?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    ISliceUrPanties schrieb:

    Wenn das egal ist
    Sein eigener Code macht das auch nicht, also denke ich, dass einfach eine der beiden Zeilen oben falsch ist.
    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!
    Es kommt halt immer drauf an was man genau machen will. Bei Millionen von Datensätzen die geprüft werden müssen würde ich eine optimierte Version schreiben, weil die Zeit einfach irgendwann eine Rolle spielt die der Code benötigt.
    Bei Adressenprüfungen musst du zudem darauf achten, das Wörter in Straßennamen wie An, Am, Dem, Den, Der, Und, Van, Vom, Zu, Zum, Zur eben nicht groß geschrieben werden dürfen ;)

    Dksksm schrieb:

    eben nicht groß geschrieben werden dürfen
    Sonst kommt der Brief nicht an?
    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!
    Es geht um Schreibregeln, was sollen solche Antworten?
    Ich möchte dich sehen wie du reagierst, wenn du für tausende Euros bei der Post Datenbereingung deiner Adressbestände kaufts und bezahlst und dann falsch geschriebene Straßennamen zurückerhältst.
    Es scheint auch, dass du noch nie mit verärgerten Kunden solcher Unternehmen zu tun hattest, wenn die Rechnungen oder Werbung mit falsch geschriebenen Adressen erhalten. Die Leute reagieren äußerst empfindlich auf so etwas.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dksksm“ ()

    Gutes Argument.

    Dksksm schrieb:

    Die Leute reagieren äußerst empfindlich auf so etwas.
    Nö, mit solch hatte ich noch nichts zu tun.
    Zu mir kommen Leute, wenn ein (komplexes) Messgerät nicht richtig funktioniert oder sie es falsch bedient haben (!).
    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!