2013-07-24 4 views
5

Ho un file di testo che ha linee di dati separate da una nuova riga. Quello che sto cercando di fare è contare il numero di righe nel file, escludendo quelle che sono solo una nuova riga.Corrisponde solo a un carattere di nuova riga

Sto cercando di utilizzare un'espressione regolare per esaminare ogni riga mentre viene letta, e se inizia con un carattere di nuova riga non lo include nel conteggio delle righe, ma non riesco a farlo funzionare correttamente . Ho cercato dappertutto su come fare questo senza risultati.

Ecco il metodo che ho scritto per cercare di fare questo:

public int LineCounter() 
{ 
    StreamReader myRead = new StreamReader(@"C:\TestFiles\test.txt"); 
    int lineCount = 0; 
    string line; 

    while ((line = myRead.ReadLine()) != null) 
    { 
     string regexExpression = @"^\r?\n"; 
     RegexOptions myOptions = RegexOptions.Multiline; 
     Match stringMatch = Regex.Match(line, regexExpression, myOptions); 
     if (stringMatch.Success) 
     { 
     } 
     else 
     { 
      lineCount++; 
     } 
    } 
    return lineCount; 
} 

Ho provato a cambiare le RegexOptions tra Singleline e Multiline, ho provato a mettere nel mio "\r|\n|\r\n" pattern match, mi e' Ho provato a rimuovere il ^ dall'espressione, ma non riesco a farlo funzionare. Qualunque cosa io faccia, il mio lineCount finisce sempre per essere il numero totale di righe nel file, incluse le nuove righe.

Apparentemente trascurando qualcosa di ovvio, ma non sono ancora abbastanza familiare con il linguaggio C# per vedere cosa c'è che non va. Sembra che tutto dovrebbe funzionare per me. Qualcuno può aiutarmi?

+0

Prova '@ "^ $ \ r? \ N?"' –

+0

ho deciso di andare con un altro @newStackExchangeInstance approccio, ma questo fissato il mio regex. Grazie :) – CurtisFreak

risposta

1

provare a cambiare il codice di un po 'di fare qualcosa di simile (la rimozione di regex). La funzione Readline rimuoverà il carattere \ n dalla riga che restituisce. Quindi se vedi una stringa vuota non nulla, allora stai effettivamente osservando ciò che stai cercando. Inoltre, vuoi avvolgere lo StreamReader con un'istruzione using per assicurarti che il file venga chiuso se succede qualcosa di catastrofico.

NOTA: questo codice conta le righe che contengono solo uno spazio. Sembrava dalla tua descrizione che questo è quello che volevi.

public int LineCounter() 
    { 
     using (StreamReader myRead = new StreamReader(@"C:\TestFiles\test.txt")) 
     { 
      int lineCount = 0; 
      string line; 

      while ((line = myRead.ReadLine()) != null) 
      { 
       if (line.Count() != 0) 
       { 
        lineCount++; 
       } 
      } 
     } 

     return lineCount; 
    } 
+0

Aha! Questo e 'esattamente quello che stavo cercando. Grazie mille! – CurtisFreak

1

Il modo più semplice contare il numero di righe nel file:

private static int LineCounter(string filePath) 
{ 
    string[] lines = File.ReadAllLines(filePath); 
    return lines.Length; 
} 
+0

Questo è buono, ma è necessario escludere quelli che sono una riga vuota. – gunr2171

+0

Sfortunatamente, questo non esclude le newline. Grazie comunque! – CurtisFreak

1

myRead.ReadLine() è striping le charactors nuova riga. Se una linea è vuota, allora ReadLine() restituirà una stringa vuota.

while ((line = myRead.ReadLine()) != null) 
{ 
    if (line.Length == 0) 
    { 
     lineCount++; 
    } 
} 

oakio mi ha dato un'idea:

lineCount = File.ReadAllLines(filePath).Count((line) => line.Length > 0); 
0

Non hai bisogno di RegEx per farlo. Basta controllare se la linea è vuota o no.

public int LineCounter() 
{ 
    StreamReader myRead = new StreamReader(@"C:\TestFiles\test.txt"); 
    int lineCount = 0; 

    while (!myRead.EndOfStream) 
    { 
     string line = myRead.ReadLine(); 
     if (!string.IsNullOrWhiteSpace(line)) 
     lineCount++; 
    } 

    myRead.Close(); 

    return lineCount; 
} 
4

Utilizzare LINQ per renderlo un contatore una riga:

private int count(string filePath) 
{ 
    string[] lines = File.ReadAllLines(filePath); 
    return lines.Count(r => !String.IsNullOrWhiteSpace(r)); 
} 

Ciò esclude anche le linee che hanno spazi bianchi in loro. È possibile modificare a String.IsNullOrEmpty(r) se si vuole contare le righe whitespaced

+0

File.ReadLines sarebbe probabilmente più veloce. –

+0

Questo ha il problema di non contare le righe che contengono solo uno spazio. Sembra dalla sua descrizione sopra che vorrebbe contare questi. –

+0

Grazie, per favore guarda la mia modifica. :) – Liel