2013-10-22 67 views
0

我有一个文本文件,它看起来像这样得到的文本的具体线路:需要从一个文本文件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类,它用于获取区域名称(所有大写字),但我似乎无法获得所有用户。我有一个用户类,有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); 
     } 

哦,我只需要获取用户标识,而不是全名以及。

回答

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

该程序假定您的输入文件与行回车结束。它使用这些常量,你将不得不修改它们的访问器在你的类声明或任何你想要(privatepublic为例):

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

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

当然,我已经做到了我的方式,可能还有很多更好的做法。以你想要的方式改进它,它只是一种应该编译和工作的草案。

除此之外,你会发现:

  • 使用using关键字,这是确保你的记忆/的ressource /文件句柄是正确释放是非常有用的。
  • 我试图避免使用硬编码值(这就是为什么我使用常量的原因,并参考列表)我试图使它所以你只需要新的常量添加到令牌参考列表
  • (称为Tokens ),并延长开关的情况来处理新的文件标记/场景

最后,不要忘了你的实例化列表User

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

真棒!它有效,但我如何获得区域?我尝试将它添加到if(line.StartsWith(“DeltaV”)条件下,因为它正好位于DeltaV行的下方。是否可以读取下一行然后跳过以下行?例如,该区域是FERM_OPR – user

+0

哎呀,我忘了你也需要区域对不起。我的代码更新,以考虑到这一点;) – AirL

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

结果: User Result

File.ReadLines

LinqPad用于测试代码片段。

您可以复制并粘贴到LinqPad修改为您的需求只需要提供它的文件。

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); 
      } 
     } 
    } 
+0

你真的应该使用string.Empty而不是“”来显示意图。这样,另一个开发者不会下线,并说他们错了,他们忘了这里的价值等等 –

相关问题