繁体   English   中英

需要从文本文件C#中获取特定的文本行

[英]Need to get Specific lines of text from a text file C#

我有一个看起来像这样的文本文件:

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类,它用于获取Area名称(全部大写的单词),但似乎无法获得所有用户。 我有一个包含2个字符串Name&Area的用户类,并且试图创建一个用户对象列表。

到目前为止,这是我尝试过的操作:(我在代码前面声明了User对象的列表)

        // 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,也不需要全名。

已编辑

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

        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;
                    }
                }
            }
        }

该程序假定您的输入文件以换行符结尾。 它使用您必须在类中或所需的任何地方通过修改它们的访问器(例如, privatepublic )来声明的常量:

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

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

当然,我已经按照自己的方式做了,可能有很多更好的方法。 以您想要的方式对其进行改进,它只是一种可以编译和工作的草稿。

除其他外,您会注意到:

  • 使用using关键字,这对于确保您的内存/资源/文件句柄正确可用非常有用。
  • 我试图避免使用硬编码值(这就是为什么我使用常量和引用列表的原因)
  • 我试图做到这一点,所以您只需要在Token引用列表(称为Tokens )中添加新的常量,并扩展切换用例以处理新的文件Token /场景

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

List<User> Users = new List<User>();

这是我的工作:

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; }
}

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

File.ReadLines

LinqPad用于测试小的代码片段。

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

    // 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);
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM