StreamReader.ReadLine 返回 NULL 字符串 C#



我正在尝试逐行读取.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();

相关内容

  • 没有找到相关文章

最新更新