我有一个在我工作场所的一堆服务器上运行的操作系统列表。提供操作系统的字符串可以是多种格式。以下是一些示例:
共有180个唯一字符串(&> 10,000个服务器)。
我的老板要求的公式将从每个字符串中提取操作系统类型和版本。我通过查找包含10个条目的表,为OS类型创建了一个可靠的工作方式。但版本公式更难,因为版本的格式取决于操作系统的类型,即使这样,每种操作系统类型也可以有多种格式。
就我而言,你需要一个包含180行的表,COL A中的字符串,COL B中的版本,然后对字符串执行Vlookup。但是,他要求从字符串中提取版本,仅使用excel公式,不使用vba。
此时我已经放弃了,所以我把它扔到了这个网站上。任何人都知道这是否可以做到,以及如何做到?
答案 0 :(得分: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或更高版本中没有操作系统。
答案 1 :(得分:2)
我认为最简单的方法是使用所谓的数组公式,它能够一次性对整个数组进行计算。输入数组公式时,必须在结尾按 Ctrl + Shift + Enter ,而不是 Enter
下面的屏幕截图显示了不同的列和要使用的公式。首先在单元格E1
中输入公式(并使用 Ctrl + Shift + Enter 进行确认)。然后选择E
并将右下角完全向下拖动,向下复制到E1
列中的其他单元格。
列A
包含您的操作系统的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 + Shift + Enter 确认为数组公式,Excel将在其周围显示大括号。每次更改公式时都必须使用此组合键。
答案 2 :(得分: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)))
如果公式中有任何错误,可能是因为我必须翻译函数。让我知道,我会帮你解决它。
答案 3 :(得分:0)
=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是任意大数。我无法准确解释该公式是如何运作的,但确实如此。