2017-12-06 4 views
0

Guten Morgen, Ich bin durch viele Textdateien in einem Ordner durchlaufen, um den Text in ihnen geschrieben zu bekommen. Der Name der Datei wird automatisch von einem anderen Progamm in einem Standard wie date_filename.id geschrieben wird, so kann ich nicht in der Lage sein, bemerkte die Dateien zu filtern, gründend auf dem Dateinamen ...CSharp Datei überspringen durch Schleife, wenn es eine Zeichenfolge enthält

ich, dass sie eine Datei Identifizierung auf dem ersten haben Zeile wie ORDERR oder Something else so dachte ich, wenn es eine Methode ist, die Datei zu überspringen, wenn die erste Zeile einige enthält string.The Schleife im Moment wie folgt aussieht:

DirectoryInfo FilesPath = new DirectoryInfo(path); 
var Files = FilesPath.GetFiles(); 
foreach (var file in Files) 
     { 
      List<string> lines = new List<string>(); 
      using (StreamReader sr = file.OpenText()) 
      { 

       string s = ""; 
       while ((s = sr.ReadLine()) != null) 
       { 
        if (s.Contains("ORDERR")) 
        { 
         "Do something" 
        } 
        else 
        { 
         break; 
        } 
       } 


      } 

Aber wenn die Schleife die zweite Zeile erreichen, Offensichtlich wird es den Rest überspringen. Was kann ich tun?

Vielen Dank im Voraus für jede Art von Hilfe

(ich nicht in der Lage sein kann, etwas über Stackoverflow zu finden)

+0

Bestell Fehler als Status ohne den Raum ORD ERR sein könnte. – netniV

+0

Ich verstehe nicht, was das Problem hier ist ... –

+0

Put Pause; die Zeile nach deinem "Tue etwas". Das wird aus der Schleife springen. –

Antwort

2

Ich bin nicht sicher, ob ich erhielt ihre Forderung wirklich. Aber ist es nicht einfach, wie (mit LINQ zur besseren Lesbarkeit):

var relevantFiles = new DirectoryInfo(path).EnumerateFiles() 
    .Where(f => File.ReadLines(f.FullName).ElementAtOrDefault(0)?.Contains("ORDERR")==false); 

Beachten Sie, dass i EnumerateFiles verwenden, die effizienter ist, weil es nicht alle Dateien in dem Speicher selbst laden muss, wenn man sie auslassen will. Gleiches gilt für File.ReadLines (im Gegensatz zu ReadAllLines). Enumerable.ElementAtOrDefault gibt null zurück, wenn die Datei leer ist, deshalb habe ich den Null-Conditional-Operator ? verwendet. Die Abfrage überspringt also Dateien, deren erste Zeile ORDERR enthält.

+0

Ernsthaft, das war die beste Antwort ... Danke – andrepogg

1

Was Sie brauchen, ist ein Flag zu setzen und brechen aus dem readloop

DirectoryInfo FilesPath = new DirectoryInfo(path); 
var Files = FilesPath.GetFiles(); 
foreach (var file in Files) 
{ 
    bool hasError = false; 
    List<string> lines = new List<string>(); 
    using (StreamReader sr = file.OpenText()) 
    { 
     string s = ""; 
     while ((s = sr.ReadLine()) != null) 
     { 
      if (s.Contains("ORDERR")) 
      { 
       hasError = true; 
       break; 
      } else { 
       lines.Add(s) 
      } 
     } 
    } 

    if (!hasError) 
    { 
     // do something with lines as we were ok with it 
    } 
} 
Verwandte Themen