2016-09-27 109 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 
}