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();
}
}
}
3 Kommentare zum Snippet