2016-01-21 12 views
5

Sagen Sie bitte eine Textdatei haben Sie als eine lange Zeichenfolge lesen:C# /. NET Zeichenfolge magic Kommentarzeilen aus der Textdateieingabe zu entfernen?

123 123 123 
123 123 123 
// Just a comment 
123 123 123  
123 123 123 
# Just a comment 
123 123 123 

Sie spalten typischerweise es in so etwas zu Linien, (zB in Unity3D),

List<string> lines = new List<string>(
     controlFile.text.Split(new string[] { "\r","\n" }, 
     StringSplitOptions.RemoveEmptyEntries)); 

.NET Angebote eine unglaubliche Menge an String-Magie, wie Formatierung und mehr.

Ich frage mich, gibt es einige verfügbaren magischen zum einfachen Entfernen von Kommentaren?

HINWEIS - natürlich man dies mit einem regex tun kann usw. Wie SonerGönül es weist darauf hin, kann sinnvollerweise mit .Where und .StartsWith

Meine Frage getan werden, gibt es eine Einrichtung im Universum von .NET-String Magie , die speziell "versteht" und hilft mit den Kommentaren.

Auch wenn die Antwort eines Experten "definitiv nein" ist, ist das eine nützliche Antwort.

+2

Das Problem ist, jedes Format ein anderes Trennzeichen für Kommentare verwendet. Daher müsste die Methode parametrisiert werden, um den Typ des Kommentartrennzeichens zu akzeptieren. Und in Ihrem Beispiel haben Sie zwei gezeigt. Gibt es mehr Möglichkeiten? Oder nur diese zwei? –

+2

Welche Möglichkeiten haben Kommentarzeilen? Beginnt nur mit '//' oder '#'? Wenn ja, können Sie etwas wie '.Where (line =>! Line.StartsWith (" // ") ||! Line.StartsWith (" # "))' vielleicht? –

+1

Eine andere wichtige Frage ist, ob Sie * inline * -Kommentare unterstützen müssen, oder können wir annehmen, dass der Kommentar am Anfang der Zeile steht und die gesamte Zeile entfernt werden kann? –

Antwort

0

FYI Rahul Antwort basierend auf SonerGönül ist falsch, der Code einen Fehler hat und funktioniert nicht.

Um jeden Typ zu sparen, hier ist eine funktionierende/getestete Antwort, die nur passend verwendet.

In Bezug auf die vorliegende Frage, es erscheint dort ist nicht alles speziell in .Net, die typische Kommentare im Text "versteht". Sie müssen nur es so von Grund auf neu schreiben mit passenden ...

// ExtensionsSystem.cs, your handy system-like extensions 
using UnityEngine; 
using System.Collections.Generic; 
using System; 
using System.Text.RegularExpressions; 
using System.Linq; 

public static class ExtensionsSystem 
    { 
    public static List<string> CleanLines(this string stringFromFile) 
     { 
     List<string> result = new List<string>(
      stringFromFile 
      .Split(new string[] { "\r","\n" }, 
       StringSplitOptions.RemoveEmptyEntries) 
      ); 

     result = result 
      .Where(line => !(line.StartsWith("//") 
          || line.StartsWith("#"))) 
      .ToList(); 

     return result; 
     } 
    } 

und dann würden Sie

List<string> lines = controlFile.text.CleanLines(); 
foreach (string ln in lines) Debug.Log(ln); 
+6

Wie unterscheidet sich das von den anderen zwei Antworten, die * bereits * gegeben wurden? –

8

Sie können wie folgt versuchen:

var t= Path.GetTempFileName(); 
var l= File.ReadLines(fileName).Where(l => !l.StartsWith("//") || !l.StartsWith("#")); 
File.WriteAllLines(t, l); 
File.Delete(fileName); 
File.Move(t, fileName); 

So können Sie im Grunde den Inhalt der Originaldatei in eine temporäre Datei kopieren, die nicht Kommentarzeile hat. Löschen Sie dann die Datei und verschieben Sie die temporäre Datei in die ursprüngliche Datei.

+3

Mehrzeilige Kommentare verursachen Probleme mit diesem^ –

+2

@ FᴀʀʜᴀɴAɴᴀᴍ Ich meine, das funktioniert nur mit den Kommentaren, die im Beispiel gezeigt werden. Die Frage ist * unglaublich * lokalisiert, hauptsächlich deshalb, weil viele Annahmen über den Inhalt der zu bearbeitenden Datei gemacht werden. Diese Antwort ist im wahrsten Sinne des Wortes vollständig und basiert auf der aktuellen Informationsmenge, die uns in der Frage gegeben wurde. –

+1

Dies wird auch "#region/# endregion" -Direktiven entfernen, die möglicherweise erwünscht sind oder nicht. –

5

Hoffnung, dass dies Sinn macht:

string[] comments = { "//", "'", "#" }; 
var CommentFreeText = File.ReadLines("fileName Here") 
         .Where(X => !comments.Any(Y => X.StartsWith(Y))); 

Sie die comments[] mit den Kommentarzeichen versehen können, die Sie aus dem Text-Datei entfernen möchten. Beim Lesen des Textes werden alle Zeilen gelöscht, die mit einem der Kommentarzeichen beginnen.

Und Sie können es zurückschreiben mit:

File.WriteAllLines("path", CommentFreeText); 
Verwandte Themen