2016-10-04 2 views
0

Ich bin neu in Codierung und ich habe mein Gehirn über die schon Abstich aber wirklich kann dies mir nicht erklären:Warum wird diese While-Schleife die erste Iteration auslassen?

ich eine CSV-Datei mit einem Inhalt wie diese:

line1_value1, line1_value2, line1_value3 
line2_value1, line2_value2, line2_value3 
line3 value1, line3_value2, line3_value3 

Für Testzwecken habe ich versucht, die Werte mit dem folgenden Code zum ausdrucken:

static void Main(string[] args) 
{ 
    Program test = new Program(); 
    test.printFile(); 
} 

System.IO.StreamReader file = new System.IO.StreamReader(@"C:\some_file.csv"); 

public void printFile() 
{ 
    string line; 

    while ((line = file.ReadLine()) != null) 
    { 
     string[] substrings = file.ReadToEnd().Split(','); 

     foreach (var substring in substrings) { 
      Console.WriteLine(substring);   
     } 

     Console.ReadLine(); 
    }   
} 

Aber es lässt die erste Zeile und Drucke:

line2_value1 
line2_value2 
line2_value3 
line3 value1 
line3_value2 
line3_value3 

Wenn ich es in einer Do While-Schleife zu tun, es funktioniert wie gedacht:

public void printFile() 
{ 
    string line; 

    do 
    { 
     string[] substrings = file.ReadToEnd().Split(',');     

     foreach (var substring in substrings) 
     { 
      Console.WriteLine(substring); 
     } 
    } 

    while ((line = file.ReadLine()) != null); 

    Console.ReadLine(); 
} 

Diese Drucke:

line1_value1 
line1_value2 
line1_value3  
line2_value1 
line2_value2 
line2_value3 
line3 value1 
line3_value2 
line3_value3 

Warum wird die erste Zeile zeigt, die nicht in der while-Schleife nach oben?

Vielen Dank im Voraus!

+0

Beide Snippets lesen die gesamte Datei mehrmals ohne Grund. Verwenden Sie 'ReadToEnd()' einmal oder besser 'ReadAllLines()'. Sie lesen gerade die gleiche Datei immer wieder –

+0

Ich möchte es Zeile-weise gelesen werden und Komma-getrennt. Also muss ich es in zwei Schleifen machen, oder? – pumuckl

+0

Es funktioniert damit: string [] substrings = line.Split (','); – pumuckl

Antwort

4

Mal sehen, was Sie tun:

while ((line = file.ReadLine()) != null) 

So lesen Sie die erste Zeile aus der Datei. Als nächstes tun Sie das:

string[] substrings = file.ReadToEnd().Split(','); 

Sie lesen den restlichen Teil der Datei bis zum Ende. Es geht nicht zurück, um die erste Zeile zu lesen, die Sie gelesen und übersprungen haben. Deshalb funktioniert es nicht wie erwartet.

Ich bin mir nicht sicher, was das richtige Verhalten sein sollte, da Ihr Lesen nicht linienbasiert zu sein scheint (also warum zuerst ReadLine verwenden?). Du könntest dich selbst lesen bis die erste , dir begegnet und weiter darauf basierend weiterarbeitet. Oder lesen Sie die gesamte Datei, wenn sie nicht zu groß ist, wie Sie es bereits in der zweiten Anweisung getan haben.

Und weiter ist die while Schleife Unsinn, da Sie bis zum Ende der Datei sowieso gelesen haben. Es wird nie eine zweite Iteration geben!

+0

Danke! Dank deiner Hilfe habe ich es so verstanden: string [] substrings = line.Split (','); Ich (denke ich) brauche es Zeilenweise für ein kleines Programm zu lesen Ich versuche zu schreiben. – pumuckl

+0

Gern geschehen! @pumuckl –

2

Dies ist, weil Sie erste Zeile aus Datei in variable Zeile lesen und nie Ausgabe verwenden.

while ((line = file.ReadLine()) != null) 

Dann ruhen Sie die Datei zu beenden (aber ohne erste Zeile)

3

Sie sind die erste Zeile an dieser Stelle zu lesen

while ((line = file.ReadLine()) != null) 

Sie können diese stattdessen tun

while(!file.EndOfStream) 
+0

Okay. Also, was ist das Problem mit dieser ? –

+0

@PatrickHofman und dann liest und teilt das OP den * Rest * der Datei. Effektiv verworfen die OP die erste Zeile '. Eine einzige 'ReadToEnd' oder' ReadAllLines' ohne Schleife wäre genug –

+0

Nein, wirklich @PanagiotisKanavos Aber warum ist das nicht in der Antwort? –

Verwandte Themen