2010-10-12 69 views
0

UPDATE:採用分體式用 r n r n

我沒有意識到托馬斯Levesque的已經發布瞭解決方案,我自己曾在此期間下面之一。我並沒有長時間使用C#/ VS2010,但我必須說C#的生產效率令人難以置信,我自that自己堅持使用C++,並推遲了學習C#的時間。

Stack<string> LdifUserStack = new Stack<string>(); 
      String LdifValidUser = null; 

      var query2 = File.ReadAllLines(args[1]).ToList(); 

      foreach (var item in query2) 
      { 

       if (item.Contains("Fullname")) continue; 

       LdifValidUser += item + System.Environment.NewLine; 

       if (LdifValidUser.Contains("GivenName:") && LdifValidUser.Contains("SN:")) 
       { 
        LdifUserStack.Push(LdifValidUser); 
        LdifValidUser = null; 
       } 

       else if (string.IsNullOrEmpty(item)) 
       { 
        LdifValidUser = null; 
       } 

      } 

結束時更新:

我有一個簡單的ldif文件,我試圖拆就/R/N/R/N,但沒有喜悅,無論組合我使用分割始終而是在每一行上發生。

var query2 = 

      from line in File.ReadAllLines(args[1]) 
      let LDIFRecord = line.Split(new string[] { "\r\n\r\n"},StringSplitOptions.None) 
      select LDIFRecord; 

      foreach (var item in query2) 
      { 
       //do something 


      } 

//Also tried line.Split(new string[] {"'\r\n','\r\n'"},StringSplitOptions.None) 
// sample ldif file 
    dn: cn=Admin1,ou=abt,o=cach 
    changetype: modify 
    GivenName: Admin 
    Fullname: Administrator for abt Server 
    SN: Admin 
    CN: Admin 

    dn: cn=admin,ou=ters,o=cach 
    changetype: modify 
    GivenName: Administrator 
    Fullname: cach Administrator 
    SN: admin 
    CN: admin 

    dn: cn=Supervisor,o=cach 
    changetype: modify 
    SN: Supervisor 
    CN: Supervisor 

回答

1

File.ReadAllLines已拆分文件到線條,使各條線不包含「\ r \ n」個序列......什麼是你想要做什麼呢?


編輯:好的,這裏有一個解決方案

在你的文件,記錄由一個空行分隔。 File.ReadAllLines返回文件中的所有行,但不分隔記錄。所以你只需要根據空行「分割」這些行的數組。

下面是一個擴展方法拆分項目基於任意標準的順序:

public static class Extensions 
{ 
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, Func<T, bool> isSeparator) 
    { 
     var list = new List<T>(); 
     foreach (var item in source) 
     { 
      if (isSeparator(item)) 
      { 
       if (list.Count > 0) 
       { 
        yield return list.AsReadOnly(); 
       } 
       list = new List<T>(); 
      } 
      else 
      { 
       list.Add(item); 
      } 
     } 
     if (list.Count > 0) 
     { 
      yield return list.AsReadOnly(); 
     } 
    } 
} 

在你的情況,你可以使用它像這樣:

var records = File.ReadAllLines(args[1]).Split(line => String.IsNullOrWhiteSpace(line)); 

這可縮短至:

var records = File.ReadAllLines(args[1]).Split(String.IsNullOrWhiteSpace); 

現在,如果您要過濾記錄以僅保留具有Give的記錄n名稱和屬性SN,你只需要使用Where

var records = File.ReadAllLines(args[1]) 
        .Split(String.IsNullOrWhiteSpace) 
        .Where(rec => rec.Any(s => s.StartsWith("GivenName:") 
          && rec.Any(s => s.StartsWith("SN:")); 
+0

我明白了。ldif文件中的每條記錄之間用/ r/n/r/n分隔,之後我只處理包含屬性GivenName的記錄:&SN: – Canacourse 2010-10-12 09:58:29

+0

請參閱我的解決方案的更新答案 – 2010-10-12 12:23:41

+0

感謝您的解釋和解決方案。 – Canacourse 2010-10-12 15:17:47

0

你爲什麼不使用string.Trim(),並檢查線路string.IsNullOrEmpty()和工作在這個前提下,而不是搜索的根據數據的來源,您不能保證的回車和換行符會像您期望的一樣。

然後,您可以開始一個新的'記錄',你會發現一個空行。

0

我看到你需要將文件信息保存到記錄的數組中。那麼爲什麼不讀循環中的每一行,當跳過2個其他(/ r/r)並且再次重複它時,用6行填充記錄的結構?

1

您是否嘗試過使用System.Environment.NewLine屬性而不是依賴顯式的'\ r'和'\ n'?

0

嘗試這樣var query2 = File.ReadAllLines(args[1]).ToList();

+0

這仍導致query2包含單獨的行。 – Canacourse 2010-10-12 15:19:43

+0

ReadAllLines將文件分割成幾行 – 2010-10-13 03:36:12

相關問題