MS excel - 根据关键字分配“类别”


1

我有excel文件与费用(花费的金额在一列),在下一栏我有简短的描述,主要由多个单词组成。我想“简化”描述并为每个描述分配一个或两个单词,这些单词将位于其旁边的另一列中。问题是描述不是“统一的”,例如我可以有“商务午餐”,“餐厅XXX的商务晚餐”,“咖啡与记者”等字符串,我想分配这些描述“食物“ 标签。还有类似模式的不同类别。

我的想法是创建另一个表(在不同的表格上) - 在一列中,我有关键词,如“咖啡”,“午餐”,“晚餐”,在我们旁边的栏中,我标记了我想要分配的,这是“食物” ”。我使用vlookup函数与近似匹配,但它返回错误的结果。由于某种原因,列表中单词的顺序似乎会影响结果,即使存在部分匹配(在字符串的一个单词中完全匹配),vlookup也会忽略它并返回其他内容。例如,我有“停在酒店xxx”,在表格中我有“停车” - “旅行费用”对,vlookup返回“食物”标签。

你能帮我解决这个问题吗?(你建议采用不同的方法吗?)


你误解了vlookup是如何工作的。您指的“最接近的匹配”只能在最左侧列中按升序排序的数字数据中正常工作。
泰森2014年

仅供参考。这是其他人有完全相同的问题,但对于Excel。mrexcel.com/forum/excel-questions / ...
Chris

Answers:


7

你想要FIND()和/或SEARCH()功能。用法:

FIND(find_text, within_text)
                                                                返回
                                                                第二个文本字符串中第一个文本字符串的起始位置(从位置1开始)

因此FIND("lunch", "lunch with customer")返回1,并FIND("lunch", "business lunch")返回10.如果在第二个字符串中找不到第一个字符串,则返回#VALUE!错误值。  SEARCH()就像是区分大小写FIND()的事实FIND()SEARCH()不是。所以

FIND("lunch", "Lunch with customer") 返回#VALUE!

SEARCH("lunch", "Lunch with customer") 返回1

我假设你会想要使用SEARCH(),不区分大小写的。

你需要设置一个这样的数组:

                                                        关键字列表

在单独的表格中这样做可能更好; 我们称之为Key-Sheet。然后,在您的数据表上:如果您的自由格式描述在列中A (从单元格开始A1),请在单元格中输入以下内容B1

=MATCH(MIN(IFERROR(SEARCH('Key-Sheet'!$A$1:$A$7,$A1),LEN($A1)+1)), SEARCH('Key-Sheet'!$A$1:$A$7,$A1))

并按Ctrl+ Shift+ Enter,使其成为“数组公式”。(它将显示在大括号中的公式栏中。)说明:

  • SEARCH('Key-Sheet'!$A$1:$A$7,$A1)- 对于每个关键字列A中的关键字(“咖啡”,“午餐”,“晚餐”等...),A在数据表的当前行,列的描述中搜索它(例如,“商务午餐” “)。这将创建一个数组包含{ #VALUE!; 10; #VALUE!; ...}(七个元素(在本例中),每个关键字一个;第二个显示“午餐”的结果,即“午餐” 'Key-Sheet'!A2
  • IFERROR(…,LEN($A1)+1)- 将#VALUE!值替换15LEN("business lunch")+1,可能不是有效的返回值SEARCH()(实际上,它高于任何可能的有效返回值SEARCH()),但这是有效数字。所以现在我们的数组是{ 15; 10; 15; ......}。
  • MIN(…)- 从数组中提取最小值:在本例中,10。一般来说,这将是(第一次)成功回归SEARCH()
  • =MATCH(…, …)- 请注意,第二个参数与MATCH()上面的第一个项目符号相同。所以我们正在寻找10数组{ #VALUE!; 10; #VALUE!; ......}。这将返回2的位置10,对应于A1数据表(“商务午餐”)中包含“午餐” 的事实,该午餐位于密钥表的第2行。

要获得费用类别,只需将索引编入B密钥表的列即可。将单元格设置C1=OFFSET('Key-Sheet'!$B$1,B1-1,0)。(这不需要是数组公式。)

                                费用数据

注意(如上所述),如果费用说明包含多个关键字,则只会找到第一个关键字。

如果您不想打扰中间值,则可以进行计算

=OFFSET('Key-Sheet'!$B$1,MATCH(MIN(IFERROR(SEARCH('Key-Sheet'!$A$1:$A$6,$A1),LEN($A1)+1)),SEARCH('Key-Sheet'!$A$1:$A$6,$A1))-1,0)

确实需要是一个数组公式。


PS FIND()SEARCH()函数有一个可选的第三个参数:

SEARCH(find_text, within_text, [start_num])

所以

SEARCH("cigar", "Sometimes a cigar is just a cigar.") 返回13

SEARCH("cigar", "Sometimes a cigar is just a cigar.", 17) 返回29

我认为没有理由让你使用它。


在使用OFFSET的一体化公式中,范围规格是1澳元:6美元一个字母错误(相对于1美元:7美元)?BTW,很好的解决方案。
fixer1234

0

正如泰森所说,“接近/近似”。匹配不是用于单词。引用帮助文件:

If range_lookup is either TRUE or is omitted, an exact or approximate match is returned. If an exact match is not found, the next largest value that is less than lookup_value is returned.

这意味着如果在“1,2,5,8,12”中查找值“7”,则返回的值将为“5”,这是与7不大于7的最接近的值。

如果没有对单个单词和语法分析进行某种广泛的编程和评估,就没有简单的方法可以做你想做的事情。

您应该做的是在最初输入数据时训练自己输入某种“类别代码”,然后使用备忘录栏中的“其他详细信息”...例如“01-Food and Drink”,“Took boss out to他的生日晚餐“。

如果你已经有大量的数据可能很难做到,你可以做一些技巧来加快速度(尽管你仍然需要进行大量的手动排序)。

首先添加一个列,检查单词“park”的描述,如果找不到则返回0,如果找到则返回1 ..类似“= If(Search(”park“,A1)> 1,1,0)” (然后将公式自动复制到数据的所有行)。然后,您可以按该列对整个表进行排序,因此您的数据将分为两组:其中包含“park”的描述,以及不包含“park”的描述。添加另一列,其中包含“食物”。然后,在“食物”和“公园”之间,您可以将(使用两列)分类为四组:没有任何单词的单词,有“食物”的单词,有“公园”的单词和有两者的单词。

重复执行此操作,您可以快速整理明显属于某一类别的组,使用类别代码对其进行标记,并在进行其他单词搜索时忽略它们,直到所有内容都已分类为止。


谢谢。是的,问题是我已经拥有它,有很多数据,但幸运的是我发现了MS的模糊查找加载项,基本上按照我的描述工作。
cgnx 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.