2010-10-12 3 views
0

UPDATE:Использования сплита с г п г п

Я не понимал, что Томас Левеска разместила решение и работала на моем ниже один в то же время. Я долгое время не использую C#/VS2010, но я должен сказать, что C# невероятно продуктивен, и я пинаю себя, что я застрял на 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; 
       } 

      } 

END UPDATE:

У меня есть простой файл Ldif, и я пытаюсь разделить на /г/п/г/п но не радость, независимо от комбинации я использую раскол всегда происходит на каждой строке.

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 уже разбивает файл на линию, поэтому отдельные строки не содержат «\ г \ п» последовательность ... Что вы пытаетесь сделать именно?


EDIT: Хорошо, вот решение

В файлах записи разделяются пустой строкой. 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); 

Теперь, если вы хотите отфильтровать записи, чтобы сохранить только те, которые имеют NNAME и 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 позже. Я обрабатываю только записи, содержащие атрибуты. Имя: & SN: – Canacourse

+0

. См. Мой обновленный ответ для решения. –

+0

Спасибо за объяснение и решение. – Canacourse

0

Почему бы вам не использовать string.Trim() и проверить, если строка string.IsNullOrEmpty() и работа на этой предпосылке вместо того, чтобы искать возврат каретки и новая строка, которую вы не можете гарантировать, всегда будут такими, как вы ожидаете, в зависимости от того, откуда поступают данные.

Вы можете начать новую запись «», где вы найдете пустую строку.

0

Я вижу, что вам нужно будет сохранить данные файла в массив stuct записи. Так почему бы не прочитать каждую строку в цикле, заполняет структуру записи с помощью 6 строк, если пропустить 2 других (/ r/r) и повторить их снова?

1

Вы пробовали, используя System.Environment.NewLine свойство вместо того, чтобы полагаться на явном «\ г» и «\ п»?

0

Попробуйте вот так var query2 = File.ReadAllLines(args[1]).ToList();

+0

Это все еще приводило к тому, что query2 содержал отдельные строки. – Canacourse

+0

ReadAllLines разделит файл на строки –