解析结构化文本输入并组合嵌套类的结构化输出

时间:2015-11-20 14:20:49

标签: c# format text-files tostring

这是我从文本文件中读取的代码。它"工作"并从文本文件中读取,但有一个小错误。它返回:{Employee: Name: Name: red ID: 123 ID: Request: Name: Name: toilet ID: 444 Desc: water ID: Desc: }我知道它为什么这样做,我只是想弄清楚如何解决它。 columns[0]值为"名称:红色\ t ID:123"并且columnms[1]值是"名称:toilet \ t ID:444 \ t Desc:water"。

我知道这样做是因为我打电话给assignment.Employee.Name,但我不知道如何调用它来让它显示在我的表单上。我认为它会像assignment.Employee,但它会给出错误,我无法将字符串转换为Employee类型。

分配是一个列表,其中包含来自其他列表的两个对象(员工和服务请求)。

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}

3 个答案:

答案 0 :(得分:0)

很抱歉这不是答案,但由于本网站的规则很奇怪,我不允许添加评论。请告诉我们名为“Assignment”的类或结构的定义,并告诉我们在代码运行后您希望它包含的内容。

答案 1 :(得分:0)

您正在string.Format()上执行this.Employee,因此基本上它会在ToString()对象上执行默认Employee,该对象将列出所有字段及其关联值。你或许有意这样称呼它:

return string.Format("Employee: {0} \t Request: {1}", this.Employee.Name, this.Request.Name);

或者您可能希望覆盖ToString()Employee对象上的ServiceRequest以返回所需的结果。

更新

由于您编辑了问题以包含Employee对象,因此上述内容无关紧要。由于您的column[0]值实际上包含文字"Name: red \t ID: 123",因此在Employee覆盖ToString时,您也不需要指定文字"Name:"

答案 2 :(得分:0)

此答案基于以下假设:数据文件中的典型文本行如下所示:

  

姓名:red \ t ID:123 |名称:厕所\ t ID:444 \ t描述:水

这让我觉得它正在编码两个对象,第一个有两个属性(Name和ID),第二个有三个属性(Name,ID,Desc)。

同一行内的对象由管道符号分隔(&#34; |&#34;)。同一对象中的属性由制表符分隔(&#34; \ t&#34;)。每个属性由一个标识符(&#34;名称&#34;,&#34; ID&#34;)和一个值(&#34;红色&#34;,&#34; 123&#34;)组成,由冒号(&#34;:&#34;)。这种对的自然数据结构将是Dictionary<string, string>

读取这样的文件会模拟嵌套。

  • 读一行;将它拆分为&#34; |&#34;每个(你的列)包含一个对象的字符串。
  • 将每个对象字符串拆分为\ t,以便每个结果字符串包含一个键和一个带冒号(&#34;:&#34;)的值以及它们之间的空格。
  • 将每个键值拆分为&#34;:&#34;将键与值分开。修剪两者以消除多余的空白区域。

此类员工或其他对象拥有一个字典来存储键/值对,而ToString()只是打印一个键,一个冒号和值来打印每一对。