2016-04-19 146 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

如果您在本文件的中間:

!reader.EndOfStreamtrue所以你必須:

while (true || answer == idStr) => while (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)你的代碼錯過了錯誤處理:你可能會得到空的「行」,並非所有的值都可能被設置爲這樣(例如,值[4],例如,會拋出超出範圍的異常,等等