如何使用StreamReader从文件中读取多行字符串?

问题描述 投票:0回答:1

给定文件中的文本数据:

Mehmet;Demirayak;IT
1
Emre;Araz;Sekten Chef
1
Nusret;Beganovic;Kein Geld
2
Ferhat;Acer;Acer Computer
2
Fevzi;Uzun;Trabzon

我的目标是使用 StreamReader 读取它并将其存储在我定义的 Personen 类中。

如果我只需要拆分一个参数,那不是问题。换句话说,如果文件中的文本仅使用分隔符“;”写入并且没有任何空格或换行符,我知道如何阅读它。然而,当我的数据中出现更复杂的结构(例如上面的结构)时,我不知道如何阅读它。

这就是我迄今为止尝试过的原因:

public void read()
{
   StreamReader sr = new StreamReader(datei);
   string s;
   int i = 0;

    while ((s = sr.ReadLine()) != null)
     {
          string[] l = s.Split(";");
      if(s.StartsWith("1") || s.StartsWith("2"))
      {
          p[i] = new Personen(l[0], l[1], l[2]);
          Console.WriteLine(p[i]);
          i++;
      }
   }

}
c# streamreader
1个回答
1
投票

根据您问题下评论中的讨论,为了实现您的目标,您可以对您阅读的每一行使用以下逻辑。如果您确实读到了“1”或“2”,则跳过当前行的拆分操作,并使用

continue
向前跳转一次迭代(感谢@PeterB 在原始答案中指出我的错误)。如果没有,则继续分割当前行并将其存储到
p
:

public static void Read(Stream stream)
{
    using StreamReader sr = new StreamReader(stream);
    string s;
    int i = 0;

    while ((s = sr.ReadLine()) != null)
    {
        var lineStartsWithControlDigit = s[0] == '1' || s[0] == '2';

        if (lineStartsWithControlDigit)
        {
            continue;
        }

        string[] l = s.Split(";");
        p[i] = new Personen(l[0], l[1], l[2]);
        
        Console.WriteLine(p[i]);
        
        i++;
    }
}

另请注意,您的语句

Console.WriteLine(p[i])
将仅打印
"Personen"
,这没有多大意义。为了让它很好地打印
p[i]
中Personen对象的内容,你可以重写
ToString()
中的方法
class Personen

public class Personen
{
    string FirstPerson { get; set; }
    string SecondPerson { get; set; }
    string ThirdPerson { get; set; }

    public Personen(string firstPerson, string secondPerson, string thirdPerson)
    {
        FirstPerson = firstPerson;
        SecondPerson = secondPerson;
        ThirdPerson = thirdPerson;
    }

    public override string ToString()
    {
        return $"{FirstPerson};{SecondPerson};{ThirdPerson}";
    }
}

运行程序并调用

read()
会在控制台中产生以下输出:

Mehmet;Demirayak;IT
Emre;Araz;Sekten Chef
Nusret;Beganovic;Kein Geld
Ferhat;Acer;Acer Computer
Fevzi;Uzun;Trabzon

使用完流后关闭流非常重要,这就是为什么我还在

using
的实例化前面添加了
StreamReader sr
。有关此内容的更多信息,请参阅在使用 C# 中使用 StreamReader 将文件加载到字符串变量时是否需要显式关闭它?

© www.soinside.com 2019 - 2024. All rights reserved.