2016-09-27 77 views
0

我有一个文件名列表,这将是这个样子:排序/成组列表中的项目

SAN003A-S6cp-201607221655.SSHOW_SYS.tgz 

SAN003A-S7cp-201607221655.SSHOW_SYS.tgz 

BrocadeRK4-S4cp-201604140110.SSHOW_SYS.tgz 

BrocadeRK4-S5cp-201604140110.SSHOW_SYS.tgz 

的共同点将成为“SNCP”的格局,其中N是一个数字。之前和之后的情况可能有所不同。它是来自网络交换机的机器生成输出。我可以在列表中有1,2个或更多。我可以处理1或2,或者它们来自同一个开关。来自同一台交换机的文件将匹配'SNcp'之前和之后的文件。如果超过2个,则意味着来自多个交换机的日志会混合在同一个文件夹中。上面的例子中有2个开关。我需要能够根据“SNCP”模式之前的内容进行排序/和/或分组。我想我需要一个正则表达式来完成它,但是当我通过正则表达式搜索分组列表时,我得到了如何执行命名组。所以我不确定GroupBy的谓词应该是什么。 'SNCP'模式的开始位置也会有所不同,所以我不确定我会如何做一个子串。

+0

多少组,你想获得以上物品?我的意思是,'N'在所有四个不同,所以你在上面的例子中寻找四个组? – dasblinkenlight

+0

而不是正则表达式,你可能想用'string.IndexOf'获得第一个短划线的索引,然后用它来获得想要分组的所需子串。 – juharr

+1

@dasblinkenlight - 对于上述,我想要两个组,一个以'SAN003A'开头的文件名,一个以'BrocadeRK4'开头的文件名' –

回答

0

因此,为了可靠地做到这一点,您需要操纵事实,即您确实知道存在各种事情的模式和原因。我假设这里的排序是A-Z递减。有一些通用的算法:

Create a Dictionary<String, List<File>>. 
FOREACH File 
    collect the first substring (0 to the first -) 
    try to add the file to the dictionary using the substring as a key 
     if it works, go to the next one 
    Catch if the Key doesn't exist 
     add the substring to the dictionary as a key with a new list 
     add the file to the dictionary using the new key. 
end FOREACH 
FOREACH key in the dictionary 
    sort the list alphabetically 
end FOREACH 

所以,字典是在通过一个共性,你做了明显的分组东西真的很好或者是切换键(SNC)或名称中它的左边(SAN3000A和类似)。我们可以这样做,因为所有潜在文件都有一个共同的分隔符( - ),所以我可以可靠地“猜测”我的密钥来自哪里。

+0

这是一个有趣的想法。他的价值可能是列表中每个交换机的2个文件的列表.... –

+0

没错。虽然,说实话,我有一个原因,我用一般算法回答。您可以在收集步骤中更改条件,并使用任何您想将其分组的条件。此解决方案还可让您通过使用Dictionary 并为第一部分(外键)和第二部分(内键)重复相同的过程来获得粒度。字典对此非常好!我也是Dictionary 的粉丝,从多态性中获得了一些真正的里程碑。 –

0

所以,如果我理解正确的话,你想要做什么,它可能对你有用:

var files = new[] 
{ 
    "SAN003A-S6cp-201607221655.SSHOW_SYS.tgz", 
    "SAN003A-S7cp-201607221655.SSHOW_SYS.tgz", 
    "BrocadeRK4-S4cp-201604140110.SSHOW_SYS.tgz", 
    "BrocadeRK4-S5cp-201604140110.SSHOW_SYS.tgz" 
}; 

var regex = new Regex("-(S[0-9]+cp)-", RegexOptions.Compiled); 
var grouped = files.GroupBy(x => regex.Match(x).Groups[1].Value); 
if (grouped.Any(x => x.Count() > 2)) 
{ 
    // logs from multiple switches are mixed in the same folder 
}