none
letzten Zeilenumbruch einer Datei entfernen RRS feed

  • Frage

  • Hallo Leute,

    der letzte Zeilenumbruch einer Datei soll entfernt werden. Das Entfernen würde wohl am günstigsten so gehen:

    string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

    Wie teste ich am schnellsten und effektivsten, ob eine Datei wirklich am Ende angelangt ist, oder besser, wie muss die Kondition codiert werden, damit der letzte Zeilenumbruch entfernt wird, und nicht ein beliebiger?Ich möchte nur ungerne mit einer zählerindizierten Schleife operieren, deren Indizie dann auf replacementString.Length geprüft wird...

    • Bearbeitet tklustig Montag, 14. Januar 2019 14:49
    Montag, 14. Januar 2019 14:47

Antworten

  • Hi,

    if( <DeinString>.EndsWith( "\r\n" ) {
        <DeinString> = <DeinString>.SubString( 0, <DeinString>.Length - 2 )
    }

    Oder mit einem TrimEnd.

    if( <DeinString>.EndsWith( "\r\n" ) {
        char[] trimChars = { '\r', '\n' };
        <DeinString> = <DeinString>.TrimEnd( trimChars );
    }
    

    Letzteres würde aber so wie es da steht, bei mehreren Zeilenumbrüchen am Ende des Strings dazu führen, dass die alle entfernt werden.

    \n anstelle von \r\n lässt sich da in die Prüfung per OrElse || mit einbauen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort vorgeschlagen Florian Haupt Montag, 14. Januar 2019 15:18
    • Als Antwort markiert tklustig Montag, 14. Januar 2019 15:24
    Montag, 14. Januar 2019 14:56
    Moderator

Alle Antworten

  • Hi,

    if( <DeinString>.EndsWith( "\r\n" ) {
        <DeinString> = <DeinString>.SubString( 0, <DeinString>.Length - 2 )
    }

    Oder mit einem TrimEnd.

    if( <DeinString>.EndsWith( "\r\n" ) {
        char[] trimChars = { '\r', '\n' };
        <DeinString> = <DeinString>.TrimEnd( trimChars );
    }
    

    Letzteres würde aber so wie es da steht, bei mehreren Zeilenumbrüchen am Ende des Strings dazu führen, dass die alle entfernt werden.

    \n anstelle von \r\n lässt sich da in die Prüfung per OrElse || mit einbauen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    • Als Antwort vorgeschlagen Florian Haupt Montag, 14. Januar 2019 15:18
    • Als Antwort markiert tklustig Montag, 14. Januar 2019 15:24
    Montag, 14. Januar 2019 14:56
    Moderator
  • Danke für Dein rasches Feedback. Anstatt eines Regex würde also folgendes funktionieren(ein lokaler Test ist derzeit nur schwer möglich)

     if(file2SendBack.EndsWith("\r\n"))
                        file2SendBack = file2SendBack.Substring(0, file2SendBack.Length - 2);

    Korrekt? Kann ich das kompilieren, ohne getestet zu haben und mich darauf verlassen, dass es klappt?

    Montag, 14. Januar 2019 15:09
  • Ach komm.

    Ein lokaler Test ist nur schwer möglich? Das ist ein Dreizeiler! Neue Konsolenanwendung, drei Zeilen rein, fertig.

    Und Nein, ich geb dir natürlich keine Garantie auf irgendwas. Teste das.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 14. Januar 2019 15:13
    Moderator
  • All right. Getestet mit einer neuen Konsolenanwendung. Passt alles. Vielen Dank nochmals für Deine rasche Hilfe. Dieser Thread kann als erfolgreich gelöst geschlossen werden.

    using System;
    namespace TestString {
        class Program {
            static void Main(string[] args) {
                string file2SendBack = "TestString"+Environment.NewLine+"erneuter Teststring" + Environment.NewLine;
                if(file2SendBack.EndsWith("\r\n"))
                    file2SendBack = file2SendBack.Substring(0, file2SendBack.Length - 2);
                Console.WriteLine(file2SendBack);
                Console.ReadKey();
            }
        }
    }



    • Bearbeitet tklustig Montag, 14. Januar 2019 15:24
    Montag, 14. Januar 2019 15:22
  • Das Verfahren wäre:

    - Das Ende der Datei auf den Zeilenumbruch prüfen

    Für kleine Dateien eignet sich das komplette einlesen in einen String und dann am Ende schauen, bei größeren kommst Du nicht am Stream vorbei.

    - Den Zeilenumbruch entfernen

    Da dieser am Ende steht, gibt es zwei Möglichkeiten, den String (bzw. Stream) neu in eine Datei schreiben, oder beim Filestream mit SetLength die Länge neu festlegen (Dateilänge - Zeilenumbruch).


    - Gruß Florian

    Montag, 14. Januar 2019 15:33