2016-04-19 25 views
0

csvファイルから人物データを読み込もうとしています.ukNumberテキストボックスに「2」と入力すると、ID 2で始まるファイルからデータが読み込まれます。 csvファイルの最後の行だけが読み込まれるため、問題が発生します。csvファイルから値を読み取ることができません

public void search_Click(object sender, EventArgs e) 
    { 
     string answer = ukNumber.Text; 

     string idStr; 
     string firstnameStr; 
     string surnameStr; 
     string jobroleStr; 
     string salaryStr; 

     using (var reader = new StreamReader(File.OpenRead("C:\\Users\\hughesa3\\Desktop\\details.csv"), 
           Encoding.GetEncoding("iso-8859-1"))) 
     { 
      while (!reader.EndOfStream || answer == idStr) 
      { 
       var line = reader.ReadLine(); 
       var values = line.Split(','); 

       idStr = values[0]; 
       firstnameStr = values[0]; 
       surnameStr = values[0]; 
       jobroleStr = values[0]; 
       salaryStr = values[0]; 

       richTextBox1.Text = "Name: " + values[1] + "\nSurname: " + values[2] + "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 
      } 
     } 
    } 
+5

あなたはrichTextBox1.Textに追加する必要があります現時点で上書きされます – Dbuggy

答えて

1

変更この行:

richTextBox1.Text = "Name: " + values[1] + "\nSurname: " + values[2] + 
        "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 

richTextBox1.Text += "Name: " + values[1] + "\nSurname: " + values[2] + 
        "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 

の代わりには、最初のStringBuilderを使用してテキスト全体を構築し、一度に richTextBox1.Textに割り当てます。

1

あなたはファイルの途中にある場合、この:

while (true || answer == idStr) => while (true) 

をそして、それは当然のファイルの末尾に移動します:

!reader.EndOfStreamはそうあなたが持っているtrueになります。

私はあなたが次のチェックをしたいと思う:

while (!reader.EndOfStream && answer != idStr) 
1

はなぜ使用しない:

string idYouSearched = "2"; 
    var encoding = Encoding.GetEncoding("iso-8859-1"); 
    var csvLines = File.ReadAllLines(fileName,encoding); 

    foreach (var line in csvLines) 
    { 
     var values = line.Split(','); 
     if(values[0].Contains(idYouSearched)) 
      { 
       richTextBox1.Text += "Name: " + values[1] + 
           "\nSurname: " + values[2] + 
          "\nJob Role: " + values[3] + 
           "\nSalary: £" + values[4]; 
      } 
     } 

    It`s much simpler and you not holding open stream when working with the UI. 
+1

'File.ReadLines'はより良いスタイルです(' 'richTextBox1.Text + ='は定数*再ペイント*と*点滅*につながり、 'StringBuilder'のすべてのデータを収集し、収集されたデータを' richTextBox1'に割り当てます。 –

1

を、私はあなたが指定したIDを持つ行から値のみを必要と理解しています。正しいIDに達したらループを解除する必要があります。

  while (!reader.EndOfStream) 
      { 
       var line = reader.ReadLine(); 
       var values = line.Split(','); 

       idStr = values[0]; 
       if (answer == idStr) { 

        richTextBox1.Text = "Name: " + values[1] + "\nSurname: " + values[2] + "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 

        break; 
       } 
      } 

サイドノート:それが表示される場合がありますよう

1)読み出し(または書き込み)CVSファイル自体は簡単な作業ではありません。 CsvHelperA Fast CSV Reader

2)あなたのコードはエラー処理に失敗します:空の "行"が得られるかもしれませんが、すべての値がこのように設定される可能性があります(例:values [4]など)。 、範囲外の例外をスローするなど

関連する問題