0

我有一个如下所示的文本文件:

DeltaV User List - 17 Jun 2013
SUPPLY_CHAIN


UserID              Full Name
BAINC               C M B
BEEMANH             H B
CERIOJI             J M C
LADUCK              K L
MAYC                C M
NEWTONC             C N

DeltaV User List - 17 Jun 2013
FERM_OPER


UserID              Full Name
POULIOTM            M P
TURNERM7            M T

我需要在 C# 中为每个部分获取个人用户,但我不知道该怎么做。我正在使用 StreamReader 类,它用于获取区域名称(全部大写的单词),但我似乎无法获取所有用户。我有一个包含 2 个字符串名称和区域的用户类,我正在尝试制作一个用户对象列表。

这是我迄今为止尝试过的:(我在代码的前面声明了一个用户对象列表)

        // read user list text file
        var userReader = new StreamReader(File.OpenRead(UserListPath));

        while(!userReader.EndOfStream)
        {
            var line = userReader.ReadLine();
            var newUser = new User();
            if(line.Contains("DeltaV User List"))
            {
                var Area = userReader.ReadLine();
                newUser.Area = Area;
                userReader.ReadLine();
                userReader.ReadLine();
                userReader.ReadLine();

                var userid = userReader.ReadLine();
                Console.WriteLine(userid);
                var name = userid.Split(' ');
                Console.WriteLine(name[0]);
                newUser.UserId = name[0];
            }
            Users.Add(newUser);
        }

哦,我只需要获取 UserId,而不是全名。

4

3 回答 3

1

已编辑

这是一小段代码,应该可以满足您的需求:

        using (var fileStream = File.OpenRead(UserListPath))
        using (var userReader = new StreamReader(fileStream))
        {
            string currentArea = string.Empty;
            string currentToken = string.Empty;
            while (!userReader.EndOfStream)
            {
                var line = userReader.ReadLine();
                if (!string.IsNullOrEmpty(line))
                {
                    var tokenFound = Tokens.FirstOrDefault(x => line.StartsWith(x));
                    if (string.IsNullOrEmpty(tokenFound))
                    {
                        switch (currentToken)
                        {
                            case AreaToken:
                                currentArea = line.Trim();
                                break;
                            case UserToken:
                                var array = line.Split(' ');
                                if (array.Length > 0)
                                {
                                    Users.Add(new User()
                                    { 
                                        Name = array[0],
                                        Area = currentArea
                                    });
                                }
                                break;
                            default:
                                break;
                        }
                    }
                    else
                    {
                        currentToken = tokenFound;
                    }
                }
            }
        }

该程序假定您的输入文件以换行符结尾。private它使用这些常量,您必须通过修改它们的访问器(例如into )在您的类或您想要的任何地方声明public

private const string AreaToken = "DeltaV";
private const string UserToken = "UserID";

private List<string> Tokens = new List<string>() { AreaToken, UserToken };

当然,我已经按照自己的方式完成了,可能还有很多更好的方法。以你想要的方式改进它,它只是一种应该编译和工作的草稿。

除其他外,您会注意到:

  • 使用using关键字,这对于确保您的内存/资源/文件句柄正确释放非常有用。
  • 我试图避免使用硬编码值(这就是我使用常量和引用列表的原因)
  • 我试图做到这一点,因此您只需将新常量添加到令牌引用列表(称为Tokens)并扩展开关案例以处理新文件令牌/场景

最后,不要忘记实例化您的User列表:

List<User> Users = new List<User>();
于 2013-10-22T23:33:39.923 回答
1

这是我的工作:

void Main()
{
    var filePath = @"..."; //insert your file path here
    var lines = File.ReadLines(filePath); //lazily read and can be started before file is fully read if giant file

    IList<User> users = new List<User>();
    var Area = string.Empty;
    foreach(var line in lines)
    {
       if(string.IsNullOrWhiteSpace(line) || 
           line.Contains("DeltaV User List") ||
           line.Contains("UserID")
          )
       {
          continue;
       }


    var values = line.Split(' ');
    if(values.Length == 1)
    {
          Area = values[0];
          continue;
    }

    var currentUser = new User
    {
          Name = values[0],
          Area = Area
    };
    users.Add(currentUser);
  }
    users.Dump("User List"); //Dump is a Linqpad method to display result see screen shot
}

// Define other methods and classes here
public class User
{
    public string Name { get; set; }
    public string Area { get; set; }
}

您发布的文件的结果: 用户结果

文件.ReadLines

LinqPad用于测试小段代码。

您可以将其复制并粘贴到 LinqPad 中以根据您的需要进行修改,只需提供一个文件即可。

于 2013-10-23T00:08:31.020 回答
1
    // read user list text file
    var userReader = new StreamReader(File.OpenRead(UserListPath));
    var Area = "";
    while(!userReader.EndOfStream)
    {
        var line = userReader.ReadLine();
        if(line.Contains("DeltaV User List"))
        {
            Area = userReader.ReadLine();  // Area applies to group of users below.
            userReader.ReadLine(); // blank line
            userReader.ReadLine(); // blank line
            userReader.ReadLine(); // User ID header line
        }
        else
        {
            if (line.trim() != "") // Could be blank line before "DeltaV..." 
            {
                var userid = line;
                var newUser = new User();
                newUser.Area = Area;
                // I left the following lines in place so that you can test the results.
                Console.WriteLine(userid);
                var name = userid.Split(' ');
                Console.WriteLine(name[0]);
                newUser.UserId = name[0];
                Users.Add(newUser);
            }
        }
    }
于 2013-10-23T00:15:20.770 回答