【问题标题】:StreamReader.ReadLine returns NULL string C# [closed]StreamReader.ReadLine 返回 NULL 字符串 C# [关闭]
【发布时间】:2018-06-21 23:42:00
【问题描述】:

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

【问题讨论】:

  • 糟糕,它是 C#
  • 使用窗口资源管理器检查文件大小。它可能是零字节长。
  • 刚刚做了。大小:169 字节,磁盘大小:0 字节
  • 删除第二个personstring = reader.ReadLine();,它已经在读取while ((personstring = reader.ReadLine()) != null) 中的行。使用File.ReadLines msdn.microsoft.com/en-us/library/dd383503#Examples 更容易
  • 我用 File.ReadLines 和一个 foreach 循环试了一下,得到了相同的结果,字符串始终为空

标签: c# string csv streamreader readline


【解决方案1】:

代码从流中为它实际解析的每一行读取两行:

while ((personstring = reader.ReadLine()) != null)
{
    personstring = reader.ReadLine();

摆脱第二个ReadLine() 调用。

当我在这里时,.Split(',')不是解析 CSV 数据的好方法。 NuGet 上有许多优秀的专用 CSV 解析器,并且(至少)三个已经内置到 .Net 框架中。使用其中之一。

【讨论】:

  • 他的问题是“文件中每一行之后都有一个空行”,并认为""为空
【解决方案2】:

您正在读取一行,将其存储到personString,测试它是否为空,然后将其丢弃并将另一个行读取到personString。因此,如果第一次读取返回最后一行,则下一个将返回 null。您正在丢弃所有奇数行。

去掉循环内的ReadLine()

while ((personstring = reader.ReadLine()) != null)
{
    Person person = ConvertStringToPerson(personstring);
    personList.Add(person);
}

您可以通过检查看到personstring 现在不可能在循环内为空。然而,根据同样的论点,它 在循环之后 为空。

【讨论】:

  • 我删除了“personstring = reader.ReadLine();”在while循环中,(我已经尝试了很多不同的版本,以至于我不小心把它放在那里两次)。结果是一样的,我得到的字符串仍然是空
  • 你得到的字符串现在不能在循环内为空。如您在 cmets 中所述,如果文件长度为零,则在循环之后 将为空。
  • 文件有169字节,文件有3行,我检查了很多次。
  • @WatchesaFriendVideos 不相信你。
  • "" 不是 null,它是一个空字符串,并且能够拆分字符串 at all初步证据不是 null。真的这很荒谬。思想质量很差。
【解决方案3】:

我猜文件的最后一行是空的。您可以尝试检查一下:

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

【讨论】:

  • 空行不会被读取为空行。
  • 这对我有用,谢谢,在每行之后文件中有一个空行,但这可能是我在 WriteFile 类中的错 :) 编辑:这仅在 Excel 中显示,在记事本中完全没问题
  • @WatchesaFriendVideos 所以它根本不为空,它是空的,或者少于 4 列。
  • 当我用调试器检查字符串时,它说 personString = "" 而当我使用 personString.Split(',') 时,它返回了一个长度为 1 的数组
  • 正如我所说。 "" 是一个零长度字符串,而不是空字符串,如果它为空,personString.split() 将失败而不是返回结果。所以它不是空的。所以你的整个问题完全是浪费大家的时间。我不在乎你的,但我的很有价值。
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2018-05-13
  • 2013-03-18
相关资源
最近更新 更多