2012-07-22 65 views
1

我有我的工作場所中一堆服務器上運行的操作系統列表。提供操作系統的字符串可以是多種格式。下面是一些樣本:使用公式,從變量字符串中提取操作系統版本號

  • AIX 5.1
  • 在VMware ESX Server 3.5.0集結110268
  • Linux的Linux的Linux的2.6.X
  • 紅帽企業AS 4(2.6.9-78.0.13 .ELlargesmp)
  • 微軟(R)的Windows(R)2000高級服務器
  • 的Microsoft Windows XP Win2008R2 6.1.7601

所有(和> 10,000個服務器)中都有180個唯一字符串。

我的老闆正在詢問一個公式,該公式將從每個字符串中提取操作系統類型和版本。我已經爲通過查找帶有十個條目的表格可靠地工作的操作系統類型做了一個。但版本公式更加嚴格,因爲版本的格式取決於操作系統的類型,即使這樣,每種操作系統類型也可能有多種格式。

就我而言,您需要一個包含180行的表,其中COL A中的字符串,COL B中的版本,然後對字符串執行Vlookup。但是,他要求從字符串中提取版本,只使用excel公式,不使用vb​​a。

我已經放棄了這一點,所以我把它扔到這個網站。任何人都知道這是否可以完成,以及如何?

+0

它可能會更容易處理與VBA,但一些答案是非常好的(即使他們可能無法處理像VBA那麼多的案件) – JMax 2012-07-23 06:55:18

回答

2

我認爲最簡單的方法是使用一個所謂的數組公式,它能夠對整個數組進行一次計算。當進入數組公式,你必須按下Ctrl鍵++在端輸入,而不是僅僅輸入

下面的截圖顯示了不同的列和使用的公式。首先輸入公式E1(並使用Ctrl + Shift + 輸入確認)。然後通過選擇E1並拖動右下角一路下跌向下複製到E列中的其他細胞。

A包含您的OS-ES的180名。列B包含它們的版本號。列D包含要查找的> 10,000個字符串。列E包含> 10,000個對應的查找版本號。

E塔中使用的公式是

=IF(MAX(COUNTIF(D1,$A$1:$A$6)),OFFSET($B$1,MAX(ROW($A$1:$A$6)*COUNTIF(D1,$A$1:$A$6))-1,0),"Not Found") 

此公式將與行號改變的D1。在你的情況,應$A$6當然可以用$A$180代替做查找您的所有180名的操作系統。我不知道,當你增加項目你要的數量規模發生了什麼表現,所以我建議這樣做,一步一步,慢慢地增加項目的數量...

如果這對你的作品,如果您需要任何幫助,我可以更詳細地解釋配方如何工作。

注:如果您按下Ctrl鍵++輸入爲確認一個數組公式,Excel會顯示周圍大括號。每次更改公式時都必須使用此組合鍵。

Screenshot of Excel sheet illustrating formula to use

+0

非常好的刺傷複雜問題(和+1順便說一句) – JMax 2012-07-23 06:53:33

+0

謝謝Reinier。這是儘可能接近你可以得到的。 – Swiftslide 2012-07-24 23:47:41

+0

不客氣。只是出於好奇:對我來說,這看起來完全回答你的問題,但你的評論意味着它不會。什麼不見​​了? – 2012-07-25 00:19:41

1

我有一段時間空閒,並決定嘗試這是一個有趣的挑戰。它可以工作,但對任何變化都非常敏感。不過,它會爲您在此處提交的所有案例輸出正確的版本號。

=IF(ISERROR(FIND(".",B2,1)),"Cannot find version number",IF(ISERROR(FIND("(",B2,1)), MID(B2, FIND(".",B2, 1)-1, IF(ISERROR(FIND(" ", B2, FIND(".", B2, 1))), LEN(B2) + 1, FIND(" ", B2, FIND(".", B2, 1))) - FIND(".", B2, 1) + 1),MID(B2,FIND("(",B2,1)+1,FIND(")",B2,1)-FIND("(",B2,1)-1))) 

如果公式中有任何錯誤,可能是因爲我必須翻譯函數。讓我知道,我會幫你解決它。

2

這裏是我的嘗試吧:

=IF(NOT(ISNUMBER(SEARCH(".", A1))), "Cannot find version number", IF(NOT(OR(MID(A1, SEARCH(".", A1) - 2, 1) = "1", MID(A1, SEARCH(".", A1) - 2, 1) = "2", MID(A1, SEARCH(".", A1) - 2, 1) = "3", MID(A1, SEARCH(".", A1) - 2, 1) = "4", MID(A1, SEARCH(".", A1) - 2, 1) = "5", MID(A1, SEARCH(".", A1) - 2, 1) = "6", MID(A1, SEARCH(".", A1) - 2, 1) = "7", MID(A1, SEARCH(".", A1) - 2, 1) = "8", MID(A1, SEARCH(".", A1) - 2, 1) = "9")), IF(NOT(ISERROR(MID(A1, SEARCH(".", A1) - 1, SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))))), MID(A1, SEARCH(".", A1) - 1, SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))), MID(A1, SEARCH(".", A1) - 1, LEN(A1))), IF(NOT(ISERROR(MID(A1, SEARCH(".", A1) - 2, SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))))), MID(A1, SEARCH(".", A1) - 2, 1 + SEARCH(" ", MID(A1, SEARCH(".", A1), LEN(A1)))), MID(A1, SEARCH(".", A1) - 2, LEN(A1))))) 

這個(複雜)式的好處是,它比9例如更高的版本中,如果整個文本是「Ubuntu Linux操作系統13.5.3, 「它會打印出」13.5.3「。希望這可以幫助!

編輯:我應該補充一點,我的公式假定不會有100或更高版本的操作系統。

0

Reinier的回答也大,但我一直在教導的作品不夠好,我的我固執的老闆滿意:)一條新的途徑。它需要一個包含大約35個值的查找表(比輸入所有180個唯一字符串要好得多,這是我之前唯一的解決方案)。它使用的公式是:

=IFERROR(LOOKUP(2^15, SEARCH('Lookup Tables'!$A$2:$A$36, $A2), 'Lookup Tables'!$B$2:$B$36), "") 

它不需要作爲數組公式輸入。在表格'查找表'中,列A保存查找術語列表,列B保存與這些術語相關的版本號。查找術語可能包含通配符。例如:

贏* 2003

將匹配它與Win任何字符串到2003年,只要前者先於後者。您不需要在字符串的左側和右側包含通配符,該公式會爲您執行此操作。奇怪的是,如果字符串匹配列表中的兩個條目,那麼最下面的一個將優先,而不是最上面。

當然,你首先必須要經過180個字符串列表,弄清查找字符串包含。

公式中的值$ A2表示包含OS串的單元格。 2^15是一個任意大的數字。我無法解釋公式如何運作,但它確實如此。