使用公式,从variablesstring中提取OS版本号
我有一个在我的工作场所的一堆服务器上运行的操作系统列表。 给操作系统的string可以是多种格式。 这里有一些样品:
- AIX 5.1
- VMware ESX Server 3.5.0 build-110268
- Linux Linux 2.6.X Linux
- 红帽企业AS 4(2.6.9-78.0.13.ELlargesmp)
- Microsoft(R)Windows(R)2000 Advanced Server
- 微软Windows XP Win2008R2 6.1.7601
所有(和> 10,000个服务器)中有180个唯一的string。
我的老板要求一个公式,将从每个string中提取操作系统types和版本。 我已经做了一个操作系统types,通过查找一个有十个条目的表可靠地工作。 但版本公式更为严格,因为版本的格式取决于操作系统的types,即使如此,每种操作系统types也可能有多种格式。
就我而言,您需要一个包含180行的表,COL A中的string,COL B中的版本,然后对string执行Vlookup。 然而,他要求从string中提取版本,只使用excel公式,没有vba。
我已经放弃了这一点,所以我把它扔到这个网站。 任何人都知道这是否可以做到,以及如何?
我认为最简单的方法是使用一个所谓的数组公式,能够在整个数组上进行计算。 input数组公式时,必须在最后按Ctrl + Shift + Enter ,而不是Enter 。
下面的截图显示了不同的列和使用的公式。 首先在单元格E1
input公式(并使用Ctrl + Shift + Enter确认)。 然后通过selectE1
并向下拖动右下angular,向下复制到E
列中的其他单元格。
列A
包含您的OS-es的180个名称。 B
列包含他们的版本号。 D
列包含要查找的> 10,000个string。 列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个操作系统的名称。 我不确定当你把物品的数量增加到你所要求的比例时会发生什么事情,所以我build议你一步一步地做,逐渐增加物品的数量。
如果这对你有用,我可以更详细地解释一下这个配方是如何工作的,如果你需要帮助的话。
注意:如果按Ctrl + Shift + Enter来确认数组公式,Excel将在其周围显示大括号。 每次更改公式时都必须使用此组合键。
这是我的尝试:
=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或更高版本的操作系统。
我有一些空闲时间,并决定尝试这是一个有趣的挑战。 它可以工作,但对任何变化都非常敏感。 不过,它会为您在这里提交的所有案例输出正确的版本号。
=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)))
如果公式中有任何错误,可能是因为我不得不翻译function。 让我知道,我会帮你解决它。
Reinier的答案也很棒,但是我被教导了一种新的方式,这种方式足以满足我顽固的老板的满意度:)。 它需要一个大约有35个值的查找表(比所有180个唯一string的条目要好得多,这是我之前唯一的解决scheme)。 它使用的公式是:
=IFERROR(LOOKUP(2^15, SEARCH('Lookup Tables'!$A$2:$A$36, $A2), 'Lookup Tables'!$B$2:$B$36), "")
它不需要作为数组公式input。 在表格“查找表”中,列A保存查找术语列表,列B保存与这些术语相关联的版本号。 查找术语可能包含通配符。 例如:
赢* 2003
将匹配任何string与Win和2003年,只要前者后者。 您不需要在string的左侧和右侧包含通配符,该公式将为您执行此操作。 奇怪的是,如果string匹配列表中的两个条目,那么最下面的那个将优先,而不是最上面。
当然,你首先必须通过180个string的列表,并找出包含哪些查找string。
公式中的值$ A2表示包含OSstring的单元格。 2 ^ 15是一个任意大的数字。 我无法解释公式是如何工作的,但确实如此。