使用拆分\ r \ n \ r \ n

时间:2010-10-12 09:48:31

标签: c# linq

更新

我没有意识到 Thomas Levesque 已经发布了一个解决方案,同时在我自己的下面上工作了一个。我没有长时间使用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文件,我试图拆分 / 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

5 个答案:

答案 0 :(得分: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);

现在,如果要过滤记录以仅保留具有GivenName和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:"));

答案 1 :(得分:1)

您是否尝试过使用System.Environment.NewLine属性而不依赖于显式的'\ r'和'\ n'?

答案 2 :(得分:0)

为什么不使用string.Trim()并检查该行是否为string.IsNullOrEmpty()并且在该前提下工作而不是搜索回车符和新行,您不能保证它总是像你一样期望取决于数据的来源。

然后,您可以在找到空行的位置开始新的“记录”。

答案 3 :(得分:0)

我看到你需要将文件信息保存到记录的数组中。那么为什么不读取循环中的每一行,当跳过另外两行(/ r / r)时,用6行填充记录的结构并再次重复?

答案 4 :(得分:0)

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