2013-10-22 155 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而不是「」來顯示意圖。這樣,另一個開發者不會下線,並說他們錯了,他們忘了這裏的價值等等 –

相關問題