1

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

  • 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 高级服务器
  • 微软视窗 XP Win2008R2 6.1.7601

总共有 180 个唯一字符串(以及超过 10,000 个服务器)。

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

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

在这一点上我几乎放弃了,所以我把它扔到这个网站上。任何人都知道这是否可以做到,以及如何做到?

4

4 回答 4

3

这是我的尝试:

=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 或更高版本没有操作系统。

于 2012-07-23T02:15:26.190 回答
2

我认为最简单的方法是使用所谓的数组公式,它能够一次性对整个数组进行计算。输入数组公式时,最后必须按++ Ctrl,而不是.ShiftEnterEnter

下面的屏幕截图显示了不同的列和要使用的公式。首先在单元格中输入公式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 将在其周围显示大括号。每次更改公式时也必须使用此组合键。

说明要使用的公式的 Excel 工作表屏幕截图

于 2012-07-23T02:29:12.843 回答
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)))

如果公式中有任何错误,可能是因为我必须翻译函数。让我知道,我会帮你解决它。

于 2012-07-23T01:28:09.453 回答
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 表示包含操作系统字符串的单元格。2^15 是一个任意大的数字。我无法准确解释该公式是如何工作的,但确实如此。

于 2012-07-25T00:00:18.900 回答