2016-01-21 8 views
5

Diciamo che avete un file di testo si legge come una lunga serie:C# /. NET magic per rimuovere le righe di commento dall'input del file di testo?

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

In genere si divide in linee a qualcosa di simile, (ad esempio in Unity3D),

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

.NET offerte un'incredibile quantità di magia per le corde, come la formattazione e altro.

Mi chiedo, c'è qualche magia disponibile per rimuovere facilmente i commenti?

NOTA - ovviamente si può fare questo utilizzando un'espressione regolare, ecc Come SonerGönül sottolinea che può utilmente essere fatto con .Where e .StartsWith

La mia domanda, c'è qualche struttura nell'universo della magia stringa .NET , che in particolare "capisce" e aiuta con i commenti.

Anche se la risposta di un esperto è "decisamente no", questa è una risposta utile.

+2

Il problema è ogni formato utilizza un delimitatore diverso per i commenti. Quindi il metodo dovrebbe essere parametrizzato per accettare il tuo tipo di delimitatore di commenti. E nel tuo esempio, ne hai mostrati due. Ci sono più possibilità? O solo quei due? –

+2

Quali sono le possibilità di una riga di commento? Inizia solo con '//' o '#'? Se è così, puoi usare qualcosa come '.Where (line =>! Line.StartsWith (" // ") ||! Line.StartsWith (" # "))' forse? –

+1

Un'altra domanda importante è che devi supportare i commenti * in linea * o possiamo supporre che il commento sia all'inizio della riga e che l'intera riga possa essere rimossa? –

risposta

0

FYI risposta di Rahul sulla base di SonerGönül è sbagliato, il codice ha un bug e non funziona.

Per salvare chiunque digiti, ecco una risposta funzionante/testata che utilizza solo la corrispondenza.

In relazione alla domanda in questione, appare lì non è qualcosa di SPECIFICO incorporato in. Net che "capisce" i commenti tipici nel testo. Non vi resta che scrivere da zero utilizzando corrispondenza come questo ...

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

e allora si sarebbe

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

Qual è la differenza rispetto alle altre due risposte * già * date? –

8

Si può provare in questo modo:

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

Quindi, si può sostanzialmente copiare il contenuto del file originale in un file temporaneo che non ha linea di commenti. Quindi eliminare il file e spostare il file temporaneo nel file originale.

+3

I commenti su più righe causano problemi con questo^ –

+2

@ FᴀʀʜᴀɴAɴᴀᴍ Voglio dire, questo funziona solo con i tipi di commenti mostrati nell'esempio. La domanda è * incredibilmente * localizzata, principalmente perché ci sono molte ipotesi sul contenuto del file in elaborazione. Questa risposta è completa in tutti i sensi della parola, in base all'attuale quantità di informazioni fornite nella domanda. –

+1

Questo rimuoverà anche le direttive '#region/# endregion', che possono o non possono essere desiderate. –

5

speranza che questo avrà un senso:

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

È possibile popolare il comments[] con il commento simboli che si desidera rimuovere dal file di testo. Durante la lettura del testo eliminerà tutte le righe che iniziano con qualsiasi simbolo del commento.

E si può scrivere di nuovo usando:

File.WriteAllLines("path", CommentFreeText); 
Problemi correlati