我正在尝试逐行读取.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");
}
}
代码从流中读取两行,用于实际分析的每一行:
while ((personstring = reader.ReadLine()) != null)
{
personstring = reader.ReadLine();
摆脱第二个ReadLine()
呼叫。
当我在这里时,.Split(',')
不是解析 CSV 数据的好方法。NuGet上有许多优秀的专用CSV解析器,并且(至少(已经内置了三个.Net框架。使用其中之一。
您正在读取一行,将其存储到personString
中,测试其是否为null,然后将其丢弃并将另一行读取到personString
中。因此,如果第一次读取返回最后一行,则下一行将返回 null。你扔掉了所有的奇数行。
摆脱循环内的ReadLine()
:
while ((personstring = reader.ReadLine()) != null)
{
Person person = ConvertStringToPerson(personstring);
personList.Add(person);
}
通过检查可以看到,现在personstring
不可能在循环内为空。但是,通过相同的参数,它在循环后将为空。
我猜文件的最后一行是空的。您可以尝试检查:
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();