C# 如何将部分文件读入对象

C# 如何将部分文件读入对象,c#,C#,我有一个文件,我想扫描,并得到一个自定义对象的部分 该文件如下所示: [Student] Name=John LastName=Doe Username=user1 Password=pass1 [Teacher] Name=Jane LastName=Doe Username=user2 Password=pass2 [Manager] Name=Jason LastName=Doe Username=user3 Password=pass3 public class Profile

我有一个文件,我想扫描,并得到一个自定义对象的部分

该文件如下所示:

[Student]
Name=John
LastName=Doe 
Username=user1
Password=pass1

[Teacher]
Name=Jane
LastName=Doe
Username=user2
Password=pass2

[Manager]
Name=Jason
LastName=Doe
Username=user3
Password=pass3
public class Profile
{
    public string studentName       { get; set; }
    public string studentLastName   { get; set; }
    public string studentUsername   { get; set; }
    public string studentPassword   { get; set; }
    public string teacherName       { get; set; }
    public string teacherLastName   { get; set; }
    public string teacherUsername   { get; set; }
    public string teacherPassword   { get; set; }
}
我有一个
Profile
类,看起来是这样的:

[Student]
Name=John
LastName=Doe 
Username=user1
Password=pass1

[Teacher]
Name=Jane
LastName=Doe
Username=user2
Password=pass2

[Manager]
Name=Jason
LastName=Doe
Username=user3
Password=pass3
public class Profile
{
    public string studentName       { get; set; }
    public string studentLastName   { get; set; }
    public string studentUsername   { get; set; }
    public string studentPassword   { get; set; }
    public string teacherName       { get; set; }
    public string teacherLastName   { get; set; }
    public string teacherUsername   { get; set; }
    public string teacherPassword   { get; set; }
}
所以,我只需要让学生和老师进入profile对象。我是这样开始的:

public Profile readFile(string filename)
{
     var profile = new Profile();

     using (StreamReader sr = new StreamReader(filename))
     {
         while (!sr.EndOfStream)
         {
             String line = sr.ReadLine();
             if (line != null && line.Contains("Student"))
             {
                 // and I am stuck here, not sure how to find 
                 // the next lines, so i can take the values
                 // and put them in the profile 
              }

              if (line != null && line.Contains("Teacher"))
              {
                 // and I am stuck here, not sure how to find 
                 // the next lines, so i can take the values
                 // and put them in the profile 
              }
          }
      }
  }

你可以这样做:

var p=new Profile();
using (StreamReader sr = new StreamReader(filename))
{
    while (!sr.EndOfStream)
    {
        String line = sr.ReadLine();
        if (line != null && line.Contains("Student"))
        {
            p.studentName=GetLineValue(sr.ReadLine());
            p.studentLastName=GetLineValue(sr.ReadLine());
            p.studentUsername=GetLineValue(sr.ReadLine());
            p.studentPassword=GetLineValue(sr.ReadLine());
        }

        if (line != null && line.Contains("Teacher"))
        {
            p.teacherName=GetLineValue(sr.ReadLine());
            p.teacherLastName=GetLineValue(sr.ReadLine());
            p.teacherUsername=GetLineValue(sr.ReadLine());
            p.teacherPassword=GetLineValue(sr.ReadLine());
        }
    }
}
private string GetLineValue(string line)
{
   return line.Substring(line.IndexOf('=')+1);
}
class memberLocation
{
    public int start, end;
}

class Program
{
    static void Main(string[] args)
    {
        memberLocation student, teacher, manager;
        student = new memberLocation();
        teacher = new memberLocation();
        manager = new memberLocation();

        String filePath = "data.txt";
        StreamReader sr = new StreamReader(filePath);
        String fileData = sr.ReadToEnd();

        student.start = fileData.IndexOf("[Student]");
        teacher.start = fileData.IndexOf("[Teacher]");
        manager.start = fileData.IndexOf("[Manager]");

        student.end = fileData.IndexOf(']', student.start + 9) - 9; // [Student] length = 9 - [Teacher] length
        teacher.end = fileData.IndexOf(']', teacher.start + 9) - 9; // [Teacher] length = 9
        manager.end = fileData.IndexOf(']', manager.start + 9) - 9; // [Manager] length = 9

        String studentStr, teacherStr, managerStr;
        if (student.end > 0)
            studentStr = fileData.Substring(student.start, student.end - student.start);
        else
            studentStr = fileData.Substring(student.start);
        if (teacher.end > 0)
            teacherStr = fileData.Substring(teacher.start, teacher.end - teacher.start);
        else
            teacherStr = fileData.Substring(teacher.start);
        if (manager.end > 0)
            managerStr = fileData.Substring(manager.start, manager.end - manager.start);
        else
            managerStr = fileData.Substring(manager.start);
    }
}

你可以这样做:

var p=new Profile();
using (StreamReader sr = new StreamReader(filename))
{
    while (!sr.EndOfStream)
    {
        String line = sr.ReadLine();
        if (line != null && line.Contains("Student"))
        {
            p.studentName=GetLineValue(sr.ReadLine());
            p.studentLastName=GetLineValue(sr.ReadLine());
            p.studentUsername=GetLineValue(sr.ReadLine());
            p.studentPassword=GetLineValue(sr.ReadLine());
        }

        if (line != null && line.Contains("Teacher"))
        {
            p.teacherName=GetLineValue(sr.ReadLine());
            p.teacherLastName=GetLineValue(sr.ReadLine());
            p.teacherUsername=GetLineValue(sr.ReadLine());
            p.teacherPassword=GetLineValue(sr.ReadLine());
        }
    }
}
private string GetLineValue(string line)
{
   return line.Substring(line.IndexOf('=')+1);
}
class memberLocation
{
    public int start, end;
}

class Program
{
    static void Main(string[] args)
    {
        memberLocation student, teacher, manager;
        student = new memberLocation();
        teacher = new memberLocation();
        manager = new memberLocation();

        String filePath = "data.txt";
        StreamReader sr = new StreamReader(filePath);
        String fileData = sr.ReadToEnd();

        student.start = fileData.IndexOf("[Student]");
        teacher.start = fileData.IndexOf("[Teacher]");
        manager.start = fileData.IndexOf("[Manager]");

        student.end = fileData.IndexOf(']', student.start + 9) - 9; // [Student] length = 9 - [Teacher] length
        teacher.end = fileData.IndexOf(']', teacher.start + 9) - 9; // [Teacher] length = 9
        manager.end = fileData.IndexOf(']', manager.start + 9) - 9; // [Manager] length = 9

        String studentStr, teacherStr, managerStr;
        if (student.end > 0)
            studentStr = fileData.Substring(student.start, student.end - student.start);
        else
            studentStr = fileData.Substring(student.start);
        if (teacher.end > 0)
            teacherStr = fileData.Substring(teacher.start, teacher.end - teacher.start);
        else
            teacherStr = fileData.Substring(teacher.start);
        if (manager.end > 0)
            managerStr = fileData.Substring(manager.start, manager.end - manager.start);
        else
            managerStr = fileData.Substring(manager.start);
    }
}

应该让您开始的一段伪代码:

if (line != null && line.Contains("Student"))
{
  var temp = new Student();

  do {
      string temp_line = String line = sr.ReadLine();

      if //temp_line is empty
      {     
        // you got the line. split on "="

        // assign the student property to the value
        // you'll have to use a bit of reflection here, but shouldn't be too hard


      }

    } while // not empty string (which means you're ready for the next object)
}
我可能会将它们分解成只填充每个对象(学生/教师等)的方法


这样做的好处是,您不依赖于顺序,您可以添加“哦,该属性不存在,跳过它”的代码,如果您想…

一点伪代码,可以让您开始:

if (line != null && line.Contains("Student"))
{
  var temp = new Student();

  do {
      string temp_line = String line = sr.ReadLine();

      if //temp_line is empty
      {     
        // you got the line. split on "="

        // assign the student property to the value
        // you'll have to use a bit of reflection here, but shouldn't be too hard


      }

    } while // not empty string (which means you're ready for the next object)
}
我可能会将它们分解成只填充每个对象(学生/教师等)的方法


好处是您不依赖于顺序,并且您可以添加代码,如果您愿意,可以使用反射,代码将显示“哦,该属性不存在,跳过它”。像这样

    public static Profile readFile(string filename)
    {
        var profile = new Profile();
        var properties = typeof(Profile).GetProperties().ToDictionary(q => q.Name, q => q);
        using (StreamReader sr = new StreamReader(filename))
        {
            String mode = "";

            while (!sr.EndOfStream)
            {
                String line = sr.ReadLine();
                if (line == "[Student]")
                {
                    mode = "student";

                    // and I am stuck here, not sure how to find 
                    // the next lines, so i can take the values
                    // and put them in the profile 
                }
                else if (line == "[Teacher]")
                {
                    mode = "teacher";
                }
                else if (!string.IsNullOrEmpty(line))
                {
                    var nameValues = line.Split(new char[] { '=' }, 2);
                    if (nameValues.Length < 2)
                        continue;

                    var key = mode + nameValues[0];

                    if (properties.ContainsKey(key))
                    {
                        var value = nameValues[1];
                        properties[key].SetValue(profile, value);
                    }

                }
            }
        }
        return profile;
    }
publicstaticprofile读取文件(字符串文件名)
{
var profile=新的profile();
var properties=typeof(Profile).GetProperties().ToDictionary(q=>q.Name,q=>q);
使用(StreamReader sr=新StreamReader(文件名))
{
字符串模式=”;
而(!sr.EndOfStream)
{
字符串行=sr.ReadLine();
如果(行=“[学生]”)
{
mode=“学生”;
//我被困在这里,不知道如何找到
//接下来的几行,这样我可以取这些值
//然后把它们放到个人资料里
}
如果(行=“[教师]”)为else
{
mode=“教师”;
}
如果(!string.IsNullOrEmpty(line))为else
{
var nameValues=line.Split(新字符[]{'='},2);
如果(nameValues.Length<2)
继续;
var key=mode+nameValues[0];
if(properties.ContainsKey(关键字))
{
var值=名称值[1];
属性[key].SetValue(配置文件,值);
}
}
}
}
回报曲线;
}

您可以使用反射。像这样

    public static Profile readFile(string filename)
    {
        var profile = new Profile();
        var properties = typeof(Profile).GetProperties().ToDictionary(q => q.Name, q => q);
        using (StreamReader sr = new StreamReader(filename))
        {
            String mode = "";

            while (!sr.EndOfStream)
            {
                String line = sr.ReadLine();
                if (line == "[Student]")
                {
                    mode = "student";

                    // and I am stuck here, not sure how to find 
                    // the next lines, so i can take the values
                    // and put them in the profile 
                }
                else if (line == "[Teacher]")
                {
                    mode = "teacher";
                }
                else if (!string.IsNullOrEmpty(line))
                {
                    var nameValues = line.Split(new char[] { '=' }, 2);
                    if (nameValues.Length < 2)
                        continue;

                    var key = mode + nameValues[0];

                    if (properties.ContainsKey(key))
                    {
                        var value = nameValues[1];
                        properties[key].SetValue(profile, value);
                    }

                }
            }
        }
        return profile;
    }
publicstaticprofile读取文件(字符串文件名)
{
var profile=新的profile();
var properties=typeof(Profile).GetProperties().ToDictionary(q=>q.Name,q=>q);
使用(StreamReader sr=新StreamReader(文件名))
{
字符串模式=”;
而(!sr.EndOfStream)
{
字符串行=sr.ReadLine();
如果(行=“[学生]”)
{
mode=“学生”;
//我被困在这里,不知道如何找到
//接下来的几行,这样我可以取这些值
//然后把它们放到个人资料里
}
如果(行=“[教师]”)为else
{
mode=“教师”;
}
如果(!string.IsNullOrEmpty(line))为else
{
var nameValues=line.Split(新字符[]{'='},2);
如果(nameValues.Length<2)
继续;
var key=mode+nameValues[0];
if(properties.ContainsKey(关键字))
{
var值=名称值[1];
属性[key].SetValue(配置文件,值);
}
}
}
}
回报曲线;
}

您可以找到大括号,如下所示:

var p=new Profile();
using (StreamReader sr = new StreamReader(filename))
{
    while (!sr.EndOfStream)
    {
        String line = sr.ReadLine();
        if (line != null && line.Contains("Student"))
        {
            p.studentName=GetLineValue(sr.ReadLine());
            p.studentLastName=GetLineValue(sr.ReadLine());
            p.studentUsername=GetLineValue(sr.ReadLine());
            p.studentPassword=GetLineValue(sr.ReadLine());
        }

        if (line != null && line.Contains("Teacher"))
        {
            p.teacherName=GetLineValue(sr.ReadLine());
            p.teacherLastName=GetLineValue(sr.ReadLine());
            p.teacherUsername=GetLineValue(sr.ReadLine());
            p.teacherPassword=GetLineValue(sr.ReadLine());
        }
    }
}
private string GetLineValue(string line)
{
   return line.Substring(line.IndexOf('=')+1);
}
class memberLocation
{
    public int start, end;
}

class Program
{
    static void Main(string[] args)
    {
        memberLocation student, teacher, manager;
        student = new memberLocation();
        teacher = new memberLocation();
        manager = new memberLocation();

        String filePath = "data.txt";
        StreamReader sr = new StreamReader(filePath);
        String fileData = sr.ReadToEnd();

        student.start = fileData.IndexOf("[Student]");
        teacher.start = fileData.IndexOf("[Teacher]");
        manager.start = fileData.IndexOf("[Manager]");

        student.end = fileData.IndexOf(']', student.start + 9) - 9; // [Student] length = 9 - [Teacher] length
        teacher.end = fileData.IndexOf(']', teacher.start + 9) - 9; // [Teacher] length = 9
        manager.end = fileData.IndexOf(']', manager.start + 9) - 9; // [Manager] length = 9

        String studentStr, teacherStr, managerStr;
        if (student.end > 0)
            studentStr = fileData.Substring(student.start, student.end - student.start);
        else
            studentStr = fileData.Substring(student.start);
        if (teacher.end > 0)
            teacherStr = fileData.Substring(teacher.start, teacher.end - teacher.start);
        else
            teacherStr = fileData.Substring(teacher.start);
        if (manager.end > 0)
            managerStr = fileData.Substring(manager.start, manager.end - manager.start);
        else
            managerStr = fileData.Substring(manager.start);
    }
}

可以找到大括号,如下所示:

var p=new Profile();
using (StreamReader sr = new StreamReader(filename))
{
    while (!sr.EndOfStream)
    {
        String line = sr.ReadLine();
        if (line != null && line.Contains("Student"))
        {
            p.studentName=GetLineValue(sr.ReadLine());
            p.studentLastName=GetLineValue(sr.ReadLine());
            p.studentUsername=GetLineValue(sr.ReadLine());
            p.studentPassword=GetLineValue(sr.ReadLine());
        }

        if (line != null && line.Contains("Teacher"))
        {
            p.teacherName=GetLineValue(sr.ReadLine());
            p.teacherLastName=GetLineValue(sr.ReadLine());
            p.teacherUsername=GetLineValue(sr.ReadLine());
            p.teacherPassword=GetLineValue(sr.ReadLine());
        }
    }
}
private string GetLineValue(string line)
{
   return line.Substring(line.IndexOf('=')+1);
}
class memberLocation
{
    public int start, end;
}

class Program
{
    static void Main(string[] args)
    {
        memberLocation student, teacher, manager;
        student = new memberLocation();
        teacher = new memberLocation();
        manager = new memberLocation();

        String filePath = "data.txt";
        StreamReader sr = new StreamReader(filePath);
        String fileData = sr.ReadToEnd();

        student.start = fileData.IndexOf("[Student]");
        teacher.start = fileData.IndexOf("[Teacher]");
        manager.start = fileData.IndexOf("[Manager]");

        student.end = fileData.IndexOf(']', student.start + 9) - 9; // [Student] length = 9 - [Teacher] length
        teacher.end = fileData.IndexOf(']', teacher.start + 9) - 9; // [Teacher] length = 9
        manager.end = fileData.IndexOf(']', manager.start + 9) - 9; // [Manager] length = 9

        String studentStr, teacherStr, managerStr;
        if (student.end > 0)
            studentStr = fileData.Substring(student.start, student.end - student.start);
        else
            studentStr = fileData.Substring(student.start);
        if (teacher.end > 0)
            teacherStr = fileData.Substring(teacher.start, teacher.end - teacher.start);
        else
            teacherStr = fileData.Substring(teacher.start);
        if (manager.end > 0)
            managerStr = fileData.Substring(manager.start, manager.end - manager.start);
        else
            managerStr = fileData.Substring(manager.start);
    }
}

您可以使用
File.ReadLine
只处理前11行。如果文件中有多个这样的数据块,您可以调整逻辑跳过每个数据块的最后6行(忽略管理器数据)。我认为采用前11行不是正确的方法,因为文件将扩展并包含不同数量的教师和学生。我说的对吗?是文本文件吗?你可以根据“[”和“]”来拆分它@christoph是的,我已经编辑了我的评论。但是,OP需要确认文件是否始终遵循给定的结构。如果一名学生后面跟着n名教师,或者教师后面跟着n名教师,则必须区别对待。@shree.pat18如果以后顺序发生变化,则取前11行不是一个好主意。您可以使用
File.ReadLine
只取前11行进行处理。如果文件中有多个这样的数据块,您可以调整逻辑跳过每个数据块的最后6行(忽略管理器数据)。我认为采用前11行不是正确的方法,因为文件将扩展并包含不同数量的教师和学生。我说的对吗?是文本文件吗?你可以根据“[”和“]”来拆分它@christoph是的,我已经编辑了我的评论。但是,OP需要确认文件是否始终遵循给定的结构。如果一个学生后面跟着n个老师,或者n个老师后面跟着一个学生,则必须区别对待。@shree.pat18如果以后顺序发生变化,那么选择前11行不是一个好主意。