2016-01-21 15 views
5

Powiedzmy, że masz plik tekstowy przeczytać w postaci długiego łańcucha:C# /. NET magic string, aby usunąć linie komentarza z wprowadzania pliku tekstowego?

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

Zazwyczaj podzieleniu go do linii coś takiego (przykład w Unity3D)

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

NET oferty niesamowita ilość magii napisów, takich jak formatowanie i więcej.

Zastanawiam się, czy jest jakiś dostępny magiczny, aby móc łatwo usuwać komentarze?

UWAGA - oczywiście można to zrobić przy użyciu regex itd Jak SonerGönül wskazuje na to może być z pożytkiem zrobić z .Where i .StartsWith

moje pytanie, czy istnieje jakiś obiekt we wszechświecie .NET ciąg magii , , które w szczególności "rozumie" i pomaga w komentowaniu.

Nawet jeśli odpowiedź eksperta brzmi "zdecydowanie nie", to przydatna odpowiedź.

+2

Problem jest każdy używa innego formatu separatora dla komentarzy. Dlatego należy sparametryzować metodę, aby zaakceptować typ ogranicznika komentarza. I w twoim przykładzie masz dwa pokazane. Czy jest więcej możliwości? A może tylko ci dwaj? –

+2

Jakie są możliwości linii komentarza? Zaczyna się tylko od '//' lub '# '? Jeśli tak, możesz użyć czegoś takiego jak '.Where (line =>! Line.StartsWith (" // ") ||! Line.StartsWith (" # "))' może? –

+1

Inną ważną kwestią jest konieczność obsługi komentarzy * inline *, czy możemy założyć, że komentarz znajduje się na początku linii, a cała linia może zostać usunięta? –

Odpowiedz

0

FYI odpowiedź Rahul oparte na SonerGönül jest źle, kod ma błąd i nie działa.

Aby zapisać kogokolwiek na maszynie, oto funkcjonująca/przetestowana odpowiedź, która po prostu używa dopasowania.

W odniesieniu do danego pytania pojawia się tam: nie jest niczego, co SPECJALNIE wbudowało się w .Net, które "rozumie" typowe komentarze w tekście. Po prostu trzeba napisać go od nowa, stosując dopasowanie takiego ...

// 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; 
     } 
    } 

a potem bym

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

Jak to się różni od pozostałych dwóch odpowiedzi, które zostały * już * podane? –

8

Możesz spróbować tak:

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); 

Więc w zasadzie można skopiować zawartość oryginalnego pliku do pliku tymczasowego, który nie posiada komentarzy linię. Następnie usuń plik i przenieś plik tymczasowy do oryginalnego pliku.

+3

Komentarze wieloliniowe spowodują problemy z tym^ –

+2

@ FᴀʀʜᴀɴAɴᴀᴍ Mam na myśli, że działa to tylko z typami komentarzy pokazanych w przykładzie. Pytanie jest * niewiarygodnie * zlokalizowane, głównie dlatego, że istnieje wiele założeń dotyczących zawartości przetwarzanego pliku. Ta odpowiedź jest kompletna w każdym znaczeniu tego słowa, ponieważ opiera się na aktualnej ilości informacji podanych nam w pytaniu. –

+1

Spowoduje to również usunięcie dyrektyw '#region/# endregion', które mogą być pożądane lub nie. –

5

nadzieję, że to będzie miało sens:

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

można wypełnić comments[] z symboli komentarz, który chcesz usunąć z pliku tekstowego. Podczas czytania tekstu wyeliminuje wszystkie linie, które zaczynają się od dowolnego z symboli komentarza.

I można napisać go z powrotem przy użyciu:

File.WriteAllLines("path", CommentFreeText); 
Powiązane problemy