C# 如何编写自定义文本阅读器

C# 如何编写自定义文本阅读器,c#,.net,C#,.net,我有一个文本文件,包含以下格式的信息。我想读取数据并执行一些操作。读取此数据的最佳方式是什么 [Employee Personal] Name: Wayne Rooney Age : 34 [End Employee Personal] [Employee salary] Salary : 300k/Week [end Employee salary] [Employee Personal] Name: Rashford Age: 22 [End Employee Personal] [E

我有一个文本文件,包含以下格式的信息。我想读取数据并执行一些操作。读取此数据的最佳方式是什么

[Employee Personal] Name: Wayne Rooney Age : 34 [End Employee Personal] [Employee salary] Salary : 300k/Week [end Employee salary] [Employee Personal] Name: Rashford Age: 22 [End Employee Personal] [Employee salary] Salary : 200k/week [end Employee salary 请尝试以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            Employee.ReadFile(FILENAME);
            foreach (Employee employee in Employee.employees)
            {
                Employee.Print(employee);
            }
            Console.ReadLine();
        }
    }
    public class Employee
    {
        public static List<Employee> employees { get; set; }
        public string name { get; set; }
        public int age { get; set; }
        public string salary { get; set; }

        enum State
        {
            PERSONAL,
            SALARY,
            NONE
        }
        public static void ReadFile(string filename)
        {
            StreamReader reader = new StreamReader(filename);
            string line = "";
            State state = State.NONE;
            Employee employee = null;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    if (line.StartsWith("["))
                    {
                        line = line.Replace("[", string.Empty);
                        line = line.Replace("]", string.Empty);

                        if (line.ToUpper().StartsWith("END"))
                        {
                            state = State.NONE;
                            if(line != "End Employee Personal")
                                employee = null;
                        }
                        else
                        {
                            switch (line)
                            {
                                case "Employee Personal":
                                    state = State.PERSONAL;
                                    employee = new Employee();
                                    if (employees == null) employees = new List<Employee>();
                                    employees.Add(employee);
                                    break;
                                case "Employee salary":
                                    state = State.SALARY;
                                    break;
                            }
                        }

                    }
                    else
                    {
                        if(line.Contains(":"))
                        {
                            string[] properties = line.Split(new char[] { ':' }).ToArray();

                            switch (state)
                            {
                                case State.PERSONAL :
                                    switch (properties[0].Trim())
                                    {
                                        case "Name" :
                                            employee.name = properties[1].Trim();
                                            break;
                                        case "Age" :
                                            employee.age = int.Parse(properties[1]);
                                            break;
                                    }
                                    break;

                                case State.SALARY :
                                    employee.salary = properties[1].Trim();
                                    break;
                            }
                        }
                    }
                }
            }
        }
        public static void Print(Employee employee)
        {
            Console.WriteLine("Name : '{0}', Age : '{1}', Salary : '{2}'", employee.name, employee.age, employee.salary);
        }

    }

}

文件的格式要求是这样的,标签放在方括号中吗?为什么不仅仅是一个普通的可序列化格式,比如json或xml?是的,它是一个遗留代码,文件格式必须是这样的只是为了清楚,它包含[Employee Personal]?是的。它表示块的开始。[End Employee Personal]表示该数据块的结束。您是否可以使用格式化为代码的虚假数据显示实际的文件提取?我不清楚姓名年龄应该如何运作。此外,如果这些是唯一的领域,那么我将尝试类似的领域。