Feedback

C# - führende Leerzeichen mehrzeiliger Strings gleichmäßig entfernen

Veröffentlicht von am 16.11.2015
(0 Bewertungen)
zwei statische öffentliche Methoden (1x für die Übergabe eines Textfiles, 1x zur direkten Übergabe eines mehrzeiligen Strings mit Zeilenumbrüchen)

Der übergebene String wird anhand von Zeilenumbrüche aufgeteilt und die erste Zeile auf führende Leerzeichen untersucht. Anschließend wird über regex aus jeder Zeile die gleiche Anzahl an führenden Leerzeichen entfernt.

Auf Exceptionhandling, Performanceoptimierung und ähnliches wurde im Snippet bewusst verzichtet. Dies kann gerne über die Kommentare geschehen.
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;


namespace WhitespaceRemover
{
    class Program
    {
        static void Main(string[] args)
        {
            WhitespaceRemover.ProcessFile(args[0]);
        }
    }


    public static class WhitespaceRemover
    {
        private static string pattern = "^\\s{0}(.*?)$";
        
        /// <summary>
        /// reads a textfile and writes the processed content back to a new textfile
        /// </summary>
        /// <param name="file"></param>
        public static void ProcessFile(string file)
        {
            //probably not the most beautiful way for getting the filename but it works :)
            var newfile = string.Format("{0}\\removedWhitespaces.txt",file.Substring(0, file.LastIndexOf('\\')));

            //call the processing method and write the processed content to the new file.
            using (var swr = new StreamWriter(newfile))
            {
                swr.Write(ProcessString(File.ReadAllText(file)));
            }           
        }

        /// <summary>
        /// removes an equal number of whitespaces on each line of a multiline string, taking the first line as reference
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static string ProcessString(string text)
        {
            //splits the multiline string into an array.
            //TODO: checking for other new line characters than the ones used in the current environment
            var textLines = text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
            
            //split the first line into a character array and loop through it as long there are blanks and count them
            var characters = textLines[0].ToCharArray();
            var count = 0;
            while (characters[count] == ' ')
            {
                count++;
            }
            
            //put the string back together line by line
            //alternative: use the original string in text and do a regex on it
            StringBuilder sb = new StringBuilder();

            foreach(var line in textLines)
            {
                sb.AppendLine(Regex.Replace(line, string.Format(pattern, string.Concat(new string[]{"{",count.ToString(),"}"})), "$1"));
            }

            return sb.ToString();
        }
    }
}

Abgelegt unter regex, whitespaceremoval.

3 Kommentare zum Snippet

SteeW schrieb am 16.11.2015:
Was mir gerade noch einfällt als TODO: Alternative Whitespacezeichen akzeptieren wie \t
Koopakiller schrieb am 16.11.2015:
Die Idee Gefällt mir echt gut. Ich habe noch 2 Anmerkungen dazu:
1. Ich würde Zeilenumbrüche an \r und \n erkennen. Das Problem an NewLine ist, das es Systemabhängig ist und es dann in einigen Dateien nicht richtig funktioniert.
2. Für die Interpretation von \t etc. empfehle ich einen 2. Parameter der angibt wie viele Leerzeichen einem Tabulator entsprechen. In VS sind es Standardmäßig 4, in Notepad dagegen 8.
SteeW schrieb am 17.11.2015:
Erweiterte Funktionalität im neuen Snippet veröffentlicht. Wollte das original Snippet nicht überschreiben, damit die Kommentare weiterhin passen.
Als code hier zu posten sieht aber nicht schön aus => ich verlinke auf ein neues Snippet. Dieses hier kann man löschen oder als Vorgängerversion stehen lassen.
-> http://dotnet-snippets.de/snippet/fuehrende-leerzeichen-mehrzeiliger-strings-gleichm-entfernen-v2/12072

Anpassungen:
1. Es werden nun zuerst Kontrollzeichen für den Zeilenumbruch gesucht
2. Es wird anhand des ersten Zeichens der ersten Zeile entschieden, welches Whitespacezeichen verwendet wurde und dessen Häufigkeit bis zum ersten anderen Zeichen geprüft.
3. Es wird nun (wie im Kommentar des Originalsnippets als Alternative beschrieben), der komplette mehrzeilige String über regex bearbeitet und nicht mehr zeilenweise in einer Schleife

Verbesserungspotential:
Wenn abwechselnd Leerzeichen und Tabs verwendet werden, wird nur das erste Whitespacezeichen gewertet. Somit können Whitespaces for dem eigentlichen Textbeginn stehen bleiben. Die Wahrscheinlichkeit, dass unterschiedliche Whitespace Zeichen verwendet werden, sehe ich jedoch als eher gering.

 

Logge dich ein, um hier zu kommentieren!