更新
我没有意识到 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
答案 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();