StreamReader.ReadLine返回NULL字符串C#

时间:2018-06-21 23:42:00

标签: c# string csv streamreader readline

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

3 个答案:

答案 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();