2013-07-24 21 views
5

Ich habe eine Textdatei, die Zeilen von Daten durch Zeilenumbrüche getrennt hat. Was ich versuche, ist die Anzahl der Zeilen in der Datei zu zählen, ausgenommen diejenigen, die nur eine Zeilenumbruch sind.Nur ein Zeilenumbruch Zeichen

Ich versuche, einen regulären Ausdruck zu verwenden, um jede Zeile zu lesen, wie es gelesen wird, und wenn es mit einem Newline-Zeichen beginnt, nicht in meiner Zeilenanzahl enthalten, aber ich kann nicht scheinen, es zu funktionieren . Ich habe überall nach dem gesucht, wie dies ohne Ergebnisse funktioniert.

Hier ist die Methode, die ich geschrieben habe, um zu versuchen, dies zu tun:

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

Ich habe versucht, die RegexOptions zwischen Singleline und Multiline zu ändern, habe ich versucht, "\r|\n|\r\n" in mein Muster Spiel setzen, und ich Ich habe versucht, die ^ aus dem Ausdruck zu entfernen, aber ich kann nicht scheinen, um es zum Laufen zu bringen. Egal, was ich tue, meine endet immer die Gesamtzahl der Zeilen in der Datei, einschließlich der Zeilenumbrüche.

Ich übersehe offensichtlich etwas offensichtlich, aber ich bin noch nicht genug vertraut mit der C# Sprache, um zu sehen, was los ist. Alles sieht so aus, als würde es mir gut gehen. Kann mir bitte jemand helfen?

+0

Try 'zählen wollen @ "^ $ \ r? \ N?"' –

+0

ich mit einem anderen Ansatz @newStackExchangeInstance beschlossen zu gehen, aber das ist meine regex fixiert. Danke :) – CurtisFreak

Antwort

1

Versuchen Sie Ihren Code ein wenig zu ändern etwas wie diese (Entfernen von regex) zu tun. Die Funktion Readline entfernt das Zeichen \ n aus der Zeile, die es zurückgibt. Wenn Sie also eine leere Nicht-Null-Zeichenfolge sehen, sehen Sie tatsächlich, wonach Sie suchen. Außerdem möchten Sie Ihren StreamReader mit einer using-Anweisung versehen, um sicherzustellen, dass die Datei geschlossen wird, wenn etwas katastrophales passiert.

HINWEIS: Dieser Code zählt Zeilen, die nur ein Leerzeichen enthalten. Es klang wie aus deiner Beschreibung, dass dies das ist, was du wolltest.

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! Genau das habe ich gesucht. Vielen Dank! – CurtisFreak

1

Der einfachste Weg, um die Anzahl der Zeilen in der Datei zählen:

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

Das ist gut, aber Sie müssen diejenigen ausschließen, die eine leere Zeile sind. – gunr2171

+0

Leider löscht das nicht die Zeilenumbrüche. Trotzdem danke! – CurtisFreak

1

myRead.ReadLine() ist die Newline charactors Striping aus. Wenn eine Zeile leer ist, gibt ReadLine() eine leere Zeichenfolge zurück.

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

oakio gab mir eine Idee:

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

Sie brauchen RegEx nicht, um dies zu tun. Überprüfen Sie, ob die Zeile leer ist oder nicht.

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

Verwenden LINQ, um es einen einzeiligen Zähler:

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

Dies wird auch Linien ausschließen, die Leerzeichen in ihnen haben. Sie können zu String.IsNullOrEmpty(r) ändern, wenn Sie whitespaced Linien

+0

File.ReadLines wäre wahrscheinlich schneller. –

+0

Dies hat das Problem, Zeilen, die nur ein Leerzeichen enthalten, nicht zu zählen. Es klingt nach seiner obigen Beschreibung, dass er diese zählen möchte. –

+0

Danke, bitte schauen Sie sich meine Bearbeitung an. :) – Liel

Verwandte Themen