TXT einlesen und nicht erlaubte Zeichen löschen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    TXT einlesen und nicht erlaubte Zeichen löschen

    Guten Morgen zusammen,

    ich lese eine TXT-Datei mit mehreren Zeilen ein. Die TXT enthält auch Zeichen, die nicht in ISO-8859-1 vorkommen.
    Nun möchte ich alle Zeichen durchgehen und die Zeichen rauslöschen, die nicht in meinem String "Erlaubt" stehen.
    Den umgekehrten Fall kann man ja gut mit Replace oder Regex lösen, aber wie bekomme ich diese Variante hin?

    Meine bisherigen Code-Überlegungen als Anfängerin:

    VB.NET-Quellcode

    1. Dim Erlaubt as String = "abcdefghijklmo ... usw."
    2. Dim InputTxt As String = My.Computer.FileSystem.ReadAllText("C:\Test.txt")
    3. Dim Final as String
    4. For each c in InputTxt
    5. Final = ??
    6. Next
    7. IO.File.WriteAllText("C:\Final.txt", Final)


    CodeTags korrigiert ~VaporiZed

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

    Hallo HenryV,

    Danke für die schnelle Antwort.

    Den Forumseintrag hatte ich auch gefunden, aber in meinem Fall passt der nicht.

    Ich habe es auch falsch formuliert...sorry. Mit dem Hinweis auf ISO-8859-1 wollte ich sagen, dass auch andere Schriftzeichen
    (bspw. arabische vorhanden sind). Diesen sollen entfernt werden. Buchstaben (ISO-8859), Zahlen und Sonderzeichen sollen beibehalten werden.

    Grüße
    Mit For Each kannst Du nicht arbeiten.
    Ich hätt ja nicht erwartet, dass ich mal die Gelegenheit habe, die Mid-Anweisung als möglichen Vorschlag einzubringen :D (ist NICHT Teil des VB6-Namespaces!)

    VB.NET-Quellcode

    1. For i = 0 To InputTxt.Count - 1
    2. If Not Erlaubt.Contains(InputTxt(i)) Then Mid(InputTxt, i + 1, 1) = "?"
    3. Next


    Ach ja: Ersetz gleich mal bitte Dein My.Computer.FileSystem. durch IO.File.

    Der Code ist definitiv superunperformant und mit Regex geht's bestimmt 1000x besser. Aber vielleicht reicht's ja …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Es gibt die VB6-Mid-FUNKTION und die Nicht-nur-VB6-Mid-ANWEISUNG, siehe MSDN. Ein sehr interessantes Konstrukt, dass von der Syntax ihresgleichen sucht. Dazu hatte ich vor langer Zeit mal ne Frage gestellt (mein allererster eigener Forenthread). Diese Anweisung ist zwar laut MSDN im VisualBasic-Namespace, ist aber ohne diesen als Sprachbestandteil zugänglich.
    Bilder
    • Mid.png

      11,31 kB, 1.031×107, 38 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Nicht-nur-VB6-Mid-ANWEISUNG

    Jo, wie gesagt: etwas crazy.
    Weil als Anweisung müsste es ja auch ein Schlüsselwort sein - isses aber nicht: docs.microsoft.com/en-us/dotne…guage-reference/keywords/
    vielleicht isses sone geheimnisvolle Extension wie die Linq2Object-Schlüsselworte (From, Aggregate, Join, Into,...) - da hab ich ja auch noch nicht herausgefunden, wo die eigentlich dokumentiert sind.
    In dem von Dir verlinkten Artikel stehen From und Mid unter unreserved keywords
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich sehe hier eigentlich keine Probleme zu prüfen, ob ein Zeichen zum ISO-8859-1 gehört.
    Hier bietet das Encoding Hilfe.

    VB.NET-Quellcode

    1. Encoding.GetEncoding("ISO-8859-1")


    Die Datei, sofern es eine sehr grosse Datei ist würde ich damit es effizient läuft mit einem FileStream öffnen.
    Einen um die Datei auszulesen, und einen um in die neue Datei zu speichern.

    EDIT: Hatte schon mal was ähnliches. Ungetestet, musst du selber prüfen ob es funktioniert.
    Spoiler anzeigen

    C#-Quellcode

    1. private static void ReviseISO88591(string fileinput)
    2. {
    3. int readbytes ;
    4. var buffer = new byte[10];
    5. var fileoutput = $"{fileinput}.new";
    6. using var fsin = new FileStream(fileinput, FileMode.Open, FileAccess.Read);
    7. using var fsout = new FileStream(fileoutput, FileMode.Create,FileAccess.Write);
    8. while ((readbytes = fsin.Read(buffer)) != 0)
    9. {
    10. var newbytes = ToISO88591(buffer, 0, readbytes);
    11. fsout.Write(newbytes,0,newbytes.Length);
    12. }
    13. }
    14. private static byte[] ToISO88591(byte [] bytes, int startindex,int count)
    15. {
    16. var bsub = bytes.Skip(startindex).Take(count).ToArray();
    17. var str = Encoding.GetEncoding("ISO-8859-1").GetString(bsub);
    18. var result = new StringBuilder();
    19. foreach (char c in str)
    20. {
    21. if (c == '?')
    22. {
    23. result.Append(c);
    24. continue;
    25. }
    26. if(IsISO88591(c))
    27. result.Append(c);
    28. }
    29. return Encoding.UTF8.GetBytes(result.ToString());
    30. }
    31. private static bool IsISO88591(char input)
    32. {
    33. var bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(input.ToString());
    34. var result = Encoding.GetEncoding("ISO-8859-1").GetString(bytes);
    35. return string.Equals(input.ToString(), result);
    36. } ​


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Bei meinem Code von #5 werden die nicht zulässigen Zeichen durch '?' ersetzt.
    Mit folgendem Code werden die Zeichen entfernt:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim Txt As String = IO.File.ReadAllText("d:\Test.txt")
    4. Txt = Txt.Replace("€"c, "¿"c) 'Euro sichern
    5. Dim a As Integer
    6. For i As Integer = Txt.Length - 1 To 1 Step -1
    7. a = AscW(Txt(i))
    8. If a > 255 Then
    9. Txt = Txt.Remove(i, 1)
    10. End If
    11. Next
    12. Txt = Txt.Replace("¿"c, "€"c) 'Euro zurück
    13. IO.File.WriteAllText("d:\Final.txt", Txt)
    14. End Sub
    15. End Module