C#从CSV文件中读取

时间:2015-02-03 11:06:41

标签: c# csv

我正在尝试使用以下代码读取csv文件 -

        List<Person> people = new List<Person>();
        Person personToAdd = new Person();


        TextFieldParser parser = new TextFieldParser(@"C:\Users\user\Documents\Book1.csv");
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        while (!parser.EndOfData)
        {
            //Processing row
            string[] fields = parser.ReadFields();
            int counter = 0;

            foreach (string field in fields)
            {
                personToAdd.username = fields[0];
                personToAdd.firstName = fields[1];
                personToAdd.lastName = fields[2];
                personToAdd.email = fields[3];
                personToAdd.password = fields[4];
                personToAdd.role = fields[5];

                people.Add(personToAdd);
            }
        }
        parser.Close();

此代码读取CSV文件,但我的人员对象中的每个条目都包含CSV文件中列出的最后一个条目。我确信这是一个相当简单的改变,但我对此并不熟悉,也无法弄清楚。

1 个答案:

答案 0 :(得分:7)

您应该在while循环中移动Person实例的创建和初始化,并删除foreach循环。每个while循环都重新加载字段

...
while (!parser.EndOfData)
{
    // Loading the fields of a Person 
    string[] fields = parser.ReadFields();

    // Starting the process that creates a new Person 
    Person personToAdd = new Person();
    personToAdd.username = fields[0];
    personToAdd.firstName = fields[1];
    personToAdd.lastName = fields[2];
    personToAdd.email = fields[3];
    personToAdd.password = fields[4];
    personToAdd.role = fields[5];

    // Adding the new person to the list
    people.Add(personToAdd);

}    ....

在上面的示例中,实例的创建在循环之外。在循环内部,您可以更改同一实例的属性,并在每个循环中读取它。退出循环时,所有添加的项目都指向同一个实例,并为从文件中读取的最后一行设置值

而是在循环内创建一个新实例,保证添加到列表中的每个项目都是不同的,其属性中包含不同的数据。