无法从csv文件中读取值

时间:2016-04-19 08:50:44

标签: c# csv

我正在尝试从csv文件加载人员数据,如果他们输入" 2"在ukNumber文本框中,它将带来以ID 2开头的文件中的数据,我有一些问题,因为它只会加载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];
            }
        }
    }

4 个答案:

答案 0 :(得分: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 :(得分:1)

如果您位于文件中间:

!reader.EndOfStream将为true,因此您拥有:

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

当然它会到文件的末尾。

我想你想要以下检查:

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

答案 2 :(得分: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.

答案 3 :(得分: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],例如,将抛出范围异常等等。