2012-04-15 6 views
1

Dieser Code wirft die Ausnahme, "Index war außerhalb der Grenzen des Arrays". Sollte dies nicht einfach jeden der aufgeteilten Daten in den vorgesehenen Array-Slot hinzufügen?Probleme mit der .Split() - Methode

while (input != null) 
{ 
    string[] splitInput = inputLine.Split(); 
    EmpNum = int.Parse(splitInput[0]); 
    EmpName = (splitInput[1]); 
    EmpAdd = (splitInput[2]); 
    EmpWage = double.Parse(splitInput[3]); 
    EmpHours = double.Parse(splitInput[4]); 
    inputLine = (myFile.ReadLine()); 
    Console.WriteLine("test {0},{1},{2}", EmpNum, EmpWage, EmpHours); 
} 

ein bisschen Um zu klären, ich bin Lesen von Daten aus einer einfachen Textdatei, die Mitarbeiterdaten (Name, Anschrift, Stunden, Mitarbeiternummer, Löhne) hat.

Ich habe meine gesamte Hauptmethode für Klarheit hinzugefügt.

using System; 
using System.IO; 

class Program 
{ 
static void Main() 
{ 

    //declare an array of employees 
    Employee[] myEmployees = new Employee[10]; 

    //declare other variables 
    string inputLine; 
    string EmpName; 
    int EmpNum; 
    double EmpWage; 
    double EmpHours; 
    string EmpAdd; 

    //declare filepath 
    string environment =   System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal) + "\\"; 

    //get input 
    Console.Write("\nEnter a file name in My Documents: "); 
    string input = Console.ReadLine(); 
    string path = environment + input; 
    Console.WriteLine("Opening the file..."); 

    //read file 
    StreamReader myFile = new StreamReader(path); 
    inputLine = (myFile.ReadLine()); 

    //split input 
    while (inputLine != null) 
    { 

     string[] splitInput = inputLine.Split(); 
     EmpNum = int.Parse(splitInput[0]); 
     EmpName = (splitInput[1]); 
     EmpAdd = (splitInput[2]); 
     EmpWage = double.Parse(splitInput[3]); 
     EmpHours = double.Parse(splitInput[4]); 
     Console.WriteLine("test {0},{1},{2}", EmpNum, EmpWage, EmpHours); 
    } 

    Console.ReadLine(); 
}//End Main() 
}//End class Program 
+0

Auch wenn andere Informationen benötigt, kann ich mehr von meinen Code schreiben. – xavi

+0

Wenn Sie Ihre 'inputLine' teilen, erhalten Sie weniger als 5 Elemente – bjarneh

+0

Sollte' while (input! = Null) 'stattdessen' while (inputLine! = Null) 'sein? –

Antwort

1

Vielleicht wird diese Version für zusätzliche Kredite gut sein :) Aber im Ernst ich bin nicht versuchen, hier zu zeigen - es ist nur, dass selbst ist, obwohl es ein Lern ​​Beispiel ist, wenn Sie einen Job zu bekommen und die Aufgabe gegeben werden Wenn Sie zum Beispiel Code schreiben, der eine CSV-Datei liest, möchten Sie nicht, dass sie abstürzt und Sie schlecht aussehen lassen. Sie werden sich also einen Gefallen tun, um einige Schritte zu kennen, um sie robuster zu machen.

Hinweis - Dies ist kein Versuch, eine Debatte über die perfekte Art und Weise zu beginnen, um Ihr Beispiel zu programmieren - nur versuchen, ein paar Tricks zu zeigen, von denen ich weiß, dass sie hilfreich sind. Ich hoffe, es hilft.

  StreamReader myFile = new StreamReader("TextFile1.txt"); 
      int lineNumber = 0; 
      while (!myFile.EndOfStream) 
      { 
       // Read the next line. 
       string inputLine = myFile.ReadLine(); 
       lineNumber++; 

       // Extract fields line. 
       string[] splitInput = inputLine.Split(); 

       // Make sure the line has the correct number of fields. 
       if (splitInput.Length == 5) 
       { 
        // Parse and validate each field. 

        if (!int.TryParse(splitInput[0], out EmpNum)) 
        { 
         Console.WriteLine("could not parse int " + splitInput[0] + " on line " + lineNumber); 
         continue; 
        } 

        EmpName = (splitInput[1]); 

        EmpAdd = (splitInput[2]); 

        if(!double.TryParse(splitInput[3], out EmpWage)) 
        { 
         Console.WriteLine("could not parse double " + " on line " + lineNumber); 
         continue; 
        } 

        EmpHours = double.Parse(splitInput[4]); 

        if (!double.TryParse(splitInput[4], out EmpHours)) 
        { 
         Console.WriteLine("could not parse double: " + " on line " + lineNumber); 
         continue; 
        } 

        // Output 
        Console.WriteLine("test {0},{1},{2}", EmpNum, EmpWage, EmpHours); 
       } 
       else 
       { 
        Console.WriteLine("Expecting 5 items from split opertation but got " + splitInput.Length + " on line " + lineNumber); 
       } 
      } 
      myFile.Close(); 

TextFile1.txt

1 2 3 4 5 
6 7 8 f9 10 
11 12 

Programm Ausgabe

test 1,5,5 
could not parse double: on line 2 
Expecting 5 items from split opertation but got 2 on line 3 
+0

danke! das ist schön – xavi

+0

froh zu helfen ... –

1

Überprüfen Sie die Zeichenfolge können Sie nicht mehr als 5 Elemente in der Eingabe bekommen und einige Zeichen in Split-Methode

ändern bieten die inputLine.Split()-inputLine.Split(','), wenn Sie Element Trennung durch Komma

Ihre Eingaben werden wie "erste", "zweite", "dritte", "weiter", "fünfte"

+0

Ich fange an, meinen Fehler zu erkennen. OK. Also habe ich eine Klasse namens "Mitarbeiter" erstellt und ich habe ein Array von 10 dieser Mitarbeiterobjekte erstellt. Was ich wirklich tun muss, liest Daten aus dieser Datei und speichert die Referenzen in diesem Array von Mitarbeiterobjekten. Hoffe das klärt die Dinge auf. – xavi

+0

wiederholen Sie dieses Muster in der Datei und machen Sie 5 Zeilen "erste", "zweite", "dritte", "weiter", "fünfte" dann lesen Sie die Datei für die Eingabe können Sie hier aus der Datei lesen http://msdn.microsoft .com/de-us/library/ms228592 (v = vs.80) .aspx – Adil

0

1) Sollte nicht die input sein?

2) Fügen Sie für jedes Array-Element einen Null-Check hinzu, bevor Sie es verwenden.

Auch denke ich,

while (input != null) 
    { 
     string[] splitInput = inputLine.Split(); 
     EmpNum = int.Parse(splitInput[0]); 
     EmpName = (splitInput[1]); 
     EmpAdd = (splitInput[2]); 
     EmpWage = double.Parse(splitInput[3]); 
     EmpHours = double.Parse(splitInput[4]); 
     inputLine = (myFile.ReadLine()); 
     Console.WriteLine("test {0},{1},{2}", EmpNum, EmpWage, EmpHours); 
    } 

sollte

while (input != null) 
    { 
     inputLine = (myFile.ReadLine()); 
     string[] splitInput = inputLine.Split(); 
     EmpNum = int.Parse(splitInput[0]); 
     EmpName = (splitInput[1]); 
     EmpAdd = (splitInput[2]); 
     EmpWage = double.Parse(splitInput[3]); 
     EmpHours = double.Parse(splitInput[4]); 

     Console.WriteLine("test {0},{1},{2}", EmpNum, EmpWage, EmpHours); 

}

Zuerst Lesen aus der Datei sein inputLine = (myFile.ReadLine()); und dann den Split-Betrieb durchführen ...

3) Wie von @Aaron Anodide vorgeschlagen, addin ga-Check für Länge sollte wie der Trick ..

etwas tun ..

inputLine = (myFile.ReadLine()); 
string[] splitInput = inputLine.Split(); 
if(splitInput!=null && splitInput.length ==5) 
{ 
EmpNum = int.Parse(splitInput[0]); 
     EmpName = (splitInput[1]); 
     EmpAdd = (splitInput[2]); 
     EmpWage = double.Parse(splitInput[3]); 
     EmpHours = double.Parse(splitInput[4]); 
     Console.WriteLine("test {0},{1},{2}", EmpNum, EmpWage, EmpHours); 
} 
+1

Wie würden Sie Ihrer Antwort eine Überprüfung der Array-Länge nach dem Split-Vorgang hinzufügen? Ich denke, das wäre hilfreich für das Poster ... –

+0

Die Überprüfung auf Nullwerte im Array hilft überhaupt nicht. Es wird niemals Nullwerte im Array geben. – Guffa

+0

@Guffa: Sie meinen Array- oder Array-Elemente ?. Wenn Sie sich auf "splitInput! = Null" beziehen, dann habe ich es hinzugefügt, um auf der sicheren Seite zu sein, bevor Sie die Eigenschaft verwenden. Wenn Sie auf Array-Elemente verweisen, sagen Sie, wenn eine Zeile in einer Datei nur drei Elemente enthält, sind die anderen Elemente nicht null? –

0

einen Haltepunkt der Linie hinzufügen, nachdem Sie den Eingang aufgeteilt, dann können Sie die Maus über das resultierende Array und klicken Sie auf das Pluszeichen . Auf diese Weise können Sie genau sehen, wie die Daten aufgeteilt werden. Dies ist besonders hilfreich, wenn versteckte Zeichen vorhanden sind, die den Split auslösen (\ n, \ t, \ r).

1

Sie haben eine Zeile, die nicht genügend Elemente enthält. Überprüfen Sie die Länge des Feldes, bevor die Elemente zu lesen:

string[] splitInput = inputLine.Split(); 
if (splitInput.Length >= 5) { 
    EmpNum = int.Parse(splitInput[0]); 
    EmpName = (splitInput[1]); 
    EmpAdd = (splitInput[2]); 
    EmpWage = double.Parse(splitInput[3]); 
    EmpHours = double.Parse(splitInput[4]); 
} else { 
    // not enough items - show an error message or something 
} 

Auch sind die Überprüfung Sie die Variable input statt inputLine im where, aber das ist nicht die Ursache für den Fehler, die Sie erhalten. Wenn Sie bis zum Ende der Datei lesen, erhalten Sie eine NULL-Referenzausnahme, wenn Sie versuchen, die NULL-Referenz in der Teilung zu verwenden.

0

Sie haben ein paar Probleme. Das erste Problem ist das Split(). Sie müssen inputLine.Split() zu inputLine.Split(',') ändern. Jetzt rufen Sie die Überladung von System.String.Split(params char[]) an und da Sie keine zu spaltenden Zeichen angeben, wird die gesamte Zeichenfolge zurückgegeben.

Die anderen Probleme (als CS Student), sollten Sie wirklich an Ihren Namenskonventionen und Fehlerprüfung arbeiten. Der Code ist ziemlich spröde und wird sehr leicht brechen. Sie sollten früh anfangen, gute Softwareentwicklungspraktiken zu erlernen und qualitativ hochwertigen Code zu schreiben.

using (FileStream fstream = new FileStream("path", FileMode.Open)) 
using (StreamReader reader = new StreamReader(fstream)) { 
    string line; 

    while (!reader.EndOfStream && (line = reader.ReadLine()) != null) { 
     string[] data = line.Split(','); 

     if (data.Length < 5) { 
      // You will have IndexOutOfRange issues 
      continue; // skip processing the current loop 
     } 

     int employeeNumber; 
     string employeeName; 
     string employeeAddress; 
     double employeeWage; 
     double employeeHours; 

     // Will be used to check validity of fields that require parsing into a type. 
     bool valid; 

     valid = int.TryParse(data[0], out employeeNumber); 

     if (!valid) { 
      // employee number is not parsable 
     } 

     employeeName = data[1]; 
     employeeAddress = data[2]; 

     valid = double.TryParse(data[3], out employeeWage); 

     if (!valid) { 
      // employee wage is not parsable 
     } 

     valid = double.TryParse(data[4], out employeeHours); 

     if (!valid) { 
      // employee hours are not parsable 
     } 
    } 
} 
+0

Vielen Dank für die Vorschläge! – xavi

+0

auch, könnten Sie möglicherweise die gültige Bool erklären? Ich schätze deine Antwort! – xavi

+0

Es ist auf fehlerhafte Daten zu überprüfen. 'double.Parse' löst eine Ausnahme aus, wenn Ihre Daten fehlerhaft sind.Angenommen, Ihre Datendatei enthält versehentlich ein Zeichen "-" (häufig nach Eingabe von Nullen). 'double.Parse' würde fehlschlagen und eine Ausnahme auslösen. Die Lösung besteht darin, 'double.TryParse' zu ​​verwenden, das true zurückgibt, wenn die Eingabe erfolgreich in double konvertiert wurde. Andernfalls wird false zurückgegeben, wenn ein Fehler aufgetreten ist (Ihre Daten waren fehlerhaft). Dadurch wird verhindert, dass eine Ausnahme ausgelöst wird, und Sie können das Problem im Code ordnungsgemäß behandeln. –

Verwandte Themen