给定文件中的文本数据:
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++;
}
}
}
根据您问题下评论中的讨论,为了实现您的目标,您可以对您阅读的每一行使用以下逻辑。如果您确实读到了“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 将文件加载到字符串变量时是否需要显式关闭它?。