解析结构化文本输入并组成嵌套类的结构化输出
本文关键字:结构化 嵌套 输出 文本 输入 | 更新日期: 2023-09-27 18:22:49
这是我从文本文件中读取的代码。它"工作"并从文本文件中读取,但有一个小错误。它返回的是:{Employee: Name: Name: red ID: 123 ID: Request: Name: Name: toilet ID: 444 Desc: water ID: Desc: }
我知道它为什么这么做,我只是不知道如何修复它。columns[0]
的值是"名称:红色''tID:123",columnms[1]
的值是"名称:厕所''tID:444''tDesc:water"。
我知道它这么做是因为我在调用assignment.Employee.Name
,但我不知道如何调用它才能在我的表单上显示它。我以为它会像assignment.Employee
一样,但后来它给出了一个错误,即我无法将字符串转换为Employee类型。
Assignment是一个列表,其中包含来自其他列表(员工和服务请求)的2个对象。
public static List<Assignment> GetAssignment()
{
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
StreamReader textIn =
new StreamReader(
new FileStream(path3, FileMode.OpenOrCreate, FileAccess.Read));
List<Assignment> assignments = new List<Assignment>();
while (textIn.Peek() != -1)
{
string row = textIn.ReadLine();
string[] columns = row.Split('|');
if (columns.Length >= 2)
{
Assignment assignment = new Assignment();
assignment.Employee.Name = columns[0];
assignment.Request.Name = columns[1];
assignments.Add(assignment);
}
}
textIn.Close();
return assignments;
}
编辑:我希望它只返回{Employee: Name: red ID: 123 Request: Name: toilet ID: 444 Desc: water}
很抱歉这不是一个答案,但由于这个网站上的奇怪规则,我不允许添加评论。请给我们一个名为"Assignment"的类或结构的定义,并告诉我们在代码运行后您希望它包含什么。
您在this.Employee
上执行string.Format()
,所以基本上它在Employee
对象上执行默认的ToString()
,它将列出所有字段及其关联值。你可能想这样称呼它:
return string.Format("Employee: {0} 't Request: {1}", this.Employee.Name, this.Request.Name);
或者,您可能想要覆盖Employee
和ServiceRequest
对象上的ToString()
,以返回所需的结果。
更新
由于您编辑了问题以包含Employee
对象,因此上述内容不相关。由于您的column[0]
值实际上具有文本"Name: red 't ID: 123"
,因此在Employee
覆盖ToString
时,您不需要指定文本"Name:"
。
这个答案是基于这样的假设,即数据文件中的一个典型文本行如下所示:
名称:红色''tID:123|名称:厕所''tID:444''t描述:水
在我看来,这就像是在编码两个对象,第一个对象有两个属性(Name和ID),第二个对象有三个属性(名称、ID和描述)。
同一行中的对象由管道符号("|")分隔。同一对象内的属性由制表符("''t")分隔。每个属性由一个标识符("Name"、"ID")和一个值("red"、"123")组成,用冒号(":")分隔。这种对的自然数据结构将是CCD_ 20。
读取这样的文件会模仿嵌套。
- 读一行;通过"|"将其拆分为字符串,每个字符串包含一个对象(您的列)
- 将这些对象字符串中的每一个拆分''t,使每个生成的字符串包含一个键和一个值,它们之间有冒号(":")和空格
- 用":"分割每个键值,以将键与值分隔开。修剪两者以去除多余的空白
雇员或其他此类对象持有一个字典来存储键/值对,ToString()只通过打印键、冒号和值来打印每一对。