我正在尝试逐行读取.CSV
文件,每行包含:
name, age, occupation, ID
我的.csv
文件当前有3行,当我尝试读取它们时,我的字符串始终为空值。
代码如下:
public static List<Person> ReadFileToList(string filePath)
{
List<Person> personList = new List<Person>();
StreamReader reader = new StreamReader(filePath);
string personstring;
while ((personstring = reader.ReadLine()) != null)
{
Person person = ConvertStringToPerson(personstring);
personList.Add(person);
}
return personList;
}
private static Person ConvertStringToPerson(string personString)
{
string[] personData = personString.Split(',');
if (personData.Length == 4)
{
Guid id = Guid.Parse(personData[3]);
return new Person(personData[0], personData[1], personData[2], id);
}
else
{
throw new FormatException(personString + "is an incorrect format");
}
}
答案 0 :(得分:1)
对于实际解析的每一行,代码从流中读取两行:
while ((personstring = reader.ReadLine()) != null)
{
personstring = reader.ReadLine();
摆脱第二个ReadLine()
呼叫。
虽然我在这里,.Split(',')
不是是解析CSV数据的一种好方法。 NuGet上有很多不错的专用CSV解析器,(至少)三个内置于.Net框架中。使用其中之一。
答案 1 :(得分:0)
您正在读取一行,将其存储到personString
中,对其进行测试是否为空,然后将其扔掉,然后将另一行 读入personString
中。因此,如果第一次读取返回了最后一行,则下一个将返回null。您将丢弃所有奇数行。
摆脱循环内的ReadLine()
:
while ((personstring = reader.ReadLine()) != null)
{
Person person = ConvertStringToPerson(personstring);
personList.Add(person);
}
通过检查可以看到,personstring
现在不可能在循环内为空。但是,根据相同的论据, 在循环后为空。
答案 2 :(得分:0)
我猜文件的最后一行是空的。您可以尝试检查:
foreach (string line in File.ReadLines(filePath))
{
if (!string.IsNullOrWhitespace(line))
{
Person person = ConvertStringToPerson(line);
personList.Add(person);
}
}
更短的选择using System.Linq
:
List<Person> personList = File.ReadLines(filePath)
.Where(line => !string.IsNullOrWhitespace(line))
.Select(ConvertStringToPerson).ToList();