使用公式,从变量字符串中提取OS版本号

时间:2012-07-22 23:43:59

标签: excel parsing substring excel-formula

我有一个在我工作场所的一堆服务器上运行的操作系统列表。提供操作系统的字符串可以是多种格式。以下是一些示例:

  • AIX 5.1
  • VMware ESX Server 3.5.0 build-110268
  • Linux Linux 2.6.X Linux
  • Red Hat Enterprise AS 4(2.6.9-78.0.13.ELlargesmp)
  • Microsoft(R)Windows(R)2000 Advanced Server
  • Microsoft Windows XP Win2008R2 6.1.7601

共有180个唯一字符串(&> 10,000个服务器)。

我的老板要求的公式将从每个字符串中提取操作系统类型和版本。我通过查找包含10个条目的表,为OS类型创建了一个可靠的工作方式。但版本公式更难,因为版本的格式取决于操作系统的类型,即使这样,每种操作系统类型也可以有多种格式。

就我而言,你需要一个包含180行的表,COL A中的字符串,COL B中的版本,然后对字符串执行Vlookup。但是,他要求从字符串中提取版本,仅使用excel公式,不使用vb​​a。

此时我已经放弃了,所以我把它扔到了这个网站上。任何人都知道这是否可以做到,以及如何做到?

4 个答案:

答案 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将在其周围显示大括号。每次更改公式时都必须使用此组合键。

Screenshot of Excel sheet illustrating formula to use

答案 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)

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是任意大数。我无法准确解释该公式是如何运作的,但确实如此。