2012-04-15 5 views
1

このコードでは、「インデックスが配列の境界外です」という例外がスローされています。これは分割された各データを指定されたアレイスロットに追加するだけでいいですか?.Split()メソッドで問題が発生しました

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

ビットを明確にするために、私は、従業員データ(名前、住所、時間、従業員番号、賃金を)持っている、単純なテキストファイルからデータを読んでいます。

わかりやすくするために私の主な方法をすべて追加しました。

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

はまた、私は私のコードの多くを投稿することができます。 – xavi

+0

あなたの 'inputLine'を分割すると、5つ以下の要素が得られます – bjarneh

+0

while(input!= null)' while(inputLine!= null) 'ではありませんか? –

答えて

1

たぶん、このバージョンでは、余分な信用のために良いだろう:)真剣に、私はここに披露するつもりはないよけれども - それは学習の例だにもかかわらず、それだけだ、あなたが仕事を得ると、タスクを与えられている場合たとえば、CSVファイルを読み込むコードを書く場合は、クラッシュさせて見栄えを悪くしないようにして、より堅牢にするためのいくつかのステップについて知っておくとよいでしょう。

注 - これは、あなたの例をコードする完璧な方法についての議論を開始しようとする試みではありません。それが助けてくれることを願って。その他の情報が必要な場合

  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 

プログラム出力

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

ありがとう!これは美しいです – xavi

+0

助けてうれしい... –

1

あなたが入力中に5つの要素を取得することはできませんあなたの文字列をチェックして、分割方法でいくつかの文字を提供

変更inputLine.Split()からinputLine.Split(',')あなたは

コンマ

して入力を要素を分離している場合は、意志

+0

私は間違いを認識し始めています。 OK。だから私は "従業員"と呼ばれるクラスを作成し、これらの従業員オブジェクトの10の配列を作成しました。私が本当に必要とするのは、このファイルからデータを読み込み、参照をこの一連の従業員オブジェクトに格納することです。これは物事をクリアすることを願っています。 – xavi

+0

ファイル内でこのパターンを繰り返し、5行目を "first"、 "second"、 "third"、 "forth"、 "fifth"と入力してファイルを読み込みます。ここからファイルを読む方法はhttp://msdn.microsoft .com/ja-us/library/ms228592(v = vs80).aspx – Adil

0

1)inputinputLineである必要がありますか?1つは、「1」、「2」、「3」、

2)使用する前に、すべての配列要素にnullチェックを追加します。

また、私は

...

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

はまずinputLine = (myFile.ReadLine());を使用してファイルから読み込まれた後、分割操作を行う

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

}

する必要があり、推測します3)@Aaron Anodideによって提案されているように、addinトリックを行う必要があります長さのためのGAチェック..

何かのような..

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

スプリット操作後の配列の長さのチェックをあなたの答えに追加する方法についてどう思いますか?私はそれがポスターに役立つだろうと思っています... –

+0

配列のヌル値をチェックすることはまったく役に立ちません。配列にはnull値はありません。 – Guffa

+0

@Guffa:配列要素または配列要素を意味しますか? 'splitInput!= null'を参照している場合は、プロパティを使用する前に安全な側に追加するだけです。配列要素を参照している場合、ファイル内の行に3つの要素しか含まれていない場合、他の要素はnullになりません。 –

0

は、あなたが入力を分割した後、結果の配列かけてすることができますマウス、ブレークポイントにラインを追加し、プラス記号をクリックしてください。この方法で、データの分割方法を正確に把握できます。これは、分割(\ n、\ t、\ r)を捨てる隠し文字がある場合に特に役立ちます。

1

十分な品物が含まれていない行があります。項目を読む前に、配列の長さを確認してください:

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 
} 

はまた、あなたがwhere内の変数inputの代わりinputLineをチェックしているが、それはあなたが得るエラーの原因ではありません。ファイルの最後まで読み込んだ場合、分割でヌル参照を使用しようとするとヌル参照例外が発生します。

0

あなたにはいくつか問題があります。最初の問題はSplit()です。 inputLine.Split()からinputLine.Split(',')に変更する必要があります。今はSystem.String.Split(params char[])のオーバーロードを呼び出しており、分割する文字を指定していないので、文字列全体が返されます。

その他の問題(CS学生の方)では、命名規則とエラーチェックを実際に行う必要があります。コードはかなり脆く、非常に簡単に壊れます。優れたソフトウェアエンジニアリングの習得を学び、高品質のコードを書くためには、早めに始めるべきです。

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

提案をありがとう! – xavi

+0

また、有効なboolについて説明できますか?私はあなたの答えをありがとう! – xavi

+0

不正なデータをチェックすることです。あなたのデータが不正であれば 'double.Parse'は例外をスローします。データファイルに誤って '-'文字が含まれているとしましょう(0を入力した後に共通)。 'double.Parse'は失敗し、例外がスローされます。解決策は 'double.TryParse'を使用することです。これは、入力が正常に二倍に変換された場合はtrueを返し、そうでない場合はエラーが発生した場合はfalseを返します(データが不正です)。これにより、例外がスローされることを防ぎ、コード内で正常に問題を処理することができます。 –

関連する問題