我试图用以下代码从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();
Run Code Online (Sandbox Code Playgroud)
此代码确实从CSV文件中读取,但我的people对象中的每个条目都包含CSV文件中列出的最后一个条目.我确信这是一个相当简单的改变,但我对此很新,无法弄明白.
您应该在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);
Run Code Online (Sandbox Code Playgroud)
} ....
在上面的示例中,实例的创建位于循环之外.在循环内部,您可以更改同一实例的属性,并在每个循环中读取它.当您退出循环时,所有添加的项目都指向同一个实例,并为从文件中读取的最后一行设置值
而是在循环内创建一个新实例,保证添加到列表中的每个项目都是不同的,其属性中包含不同的数据.