在文本段落中查找关键字(在 Excel 中)

在文本段落中查找关键字(在 Excel 中)

编辑:所有答案都很好,但对于大数据集,宏观方法效果更好。尝试所有答案,看看哪种方法最适合您。

我正在尝试在 Excel 中解决这个问题以提高性能(我已经在 R 中解决了这个问题,但速度很慢)。基本上,我需要将每个关键字(来自关键字列表)与列中的文本(基本上是段落)进行匹配。以下是一个例子:

以上数据均在本题的来源处,以文本形式提供,适合复制粘贴。

我一直在寻找一些文本函数(例如 FIND 和 SEARCH,但它们只返回位置),所以我不确定这是否可以在 Excel 中完成。

答案1

尝试这个简短的宏:

Sub KeyWord()
    Dim Na As Long, Nc As Long, ary, s As String
    Dim r As Range, a, i As Long, outpt As String

    Na = Cells(Rows.Count, "A").End(xlUp).Row
    Nc = Cells(Rows.Count, "C").End(xlUp).Row

    ReDim ary(1 To Nc)
    i = 1
    For Each r In Range("C1:C" & Nc)
        ary(i) = r.Text
        i = i + 1
    Next r

    For i = 1 To Na
        s = Cells(i, "A").Value
        outpt = ""
        For Each a In ary
            If InStr(1, s, a) > 0 Then
                outpt = outpt & "," & a
            End If
        Next a
        If outpt = "" Then
        Else
            Cells(i, "E").Value = Mid(outpt, 2)
        End If
    Next i

End Sub

例如:

在此处输入图片描述

编辑#1:

我们捕捉完整单词的小技巧是用空格将每个关键字和每个句子括起来。

这意味着[空间][空间]不匹配剧院!:

Sub KeyWord_II_TheSequel()
    Dim Na As Long, Nc As Long, ary, s As String
    Dim r As Range, a, i As Long, outpt As String

    Na = Cells(Rows.Count, "A").End(xlUp).Row
    Nc = Cells(Rows.Count, "C").End(xlUp).Row

    ReDim ary(1 To Nc)
    i = 1
    For Each r In Range("C1:C" & Nc)
        ary(i) = r.Text
        ary(i) = " " & ary(i) & " "
        i = i + 1
    Next r

    For i = 1 To Na
        s = Cells(i, "A").Value
        s = " " & s & " "
        outpt = ""
        For Each a In ary
            If InStr(1, s, a) > 0 Then
                outpt = outpt & "," & a
            End If
        Next a
        If outpt = "" Then
        Else
            Cells(i, "E").Value = Mid(outpt, 2)
        End If
    Next i

End Sub

答案2

免责声明:

很难估计以下“数组公式”在大量关键字上的性能。它适用于合理的数据集并产生“正确”的结果。

数组公式E2然后自动填充 E 列)是:

E2:
=TEXTJOIN(", ",TRUE,REPT(C$2:C$99999,ISNUMBER(SEARCH(C$2:C$99999,A2))))

CTRLSHIFTENTER

正如我所说,它是在“相当大”的集合上进行测试的,比如说几千个,所以我将它发布为类似情况的一般解决方案,但我对你的 700k 的庞大集合表示怀疑(!)。

另外,建议不要保留公式,而只使用它们进行计算,然后修复值,最后删除空单元格。HTH

答案3

我假设您显示A6in的输出E5 (因为 的输出为“无”)是一个错误,而您确实想要inA5的输出。A6E6

我觉得这很不自然,将关键字放在一列中。 的输出是 in ,而 in 的值  实际上与 Row 中的其他内容没有任何关系 AiEiCii. 这更像是×n情况,你有要搜索的文本单元格(段落),以及n要查找的关键字。好吧,我们有办法处理这个问题。

我的解决方案使用n +1 辅助列。由于n这里是 5,这意味着有 6 个辅助列,可以是 Columns F到 K。(与辅助列一样,您可以将它们放在任何您想要的位置 — 如果您愿意,您可以将它们放在 Columns AA到 中 AF— 并且您可以隐藏它们。)

第一个(F)留空。输入

=OFFSET($C$1, COLUMN()-COLUMN($F:$F), 0)

到单元格中G1并拖动/填充到右侧,到K1。这将使用当前列号(相对于辅助列块的开头)作为 列 (关键字)的索引 ,从而复制第 1 行(单元格到 )C中的关键字 。G1K1

接下来,输入

=F2 & IF(ISNUMBER(SEARCH(G$1, $A2)), ", " & G$1, "")

到单元格G2。向右拖动/填充到单元格 K2,然后向下覆盖列 中包含数据的行 A。此操作将在 A当前行的列  段落中搜索  第 th 个关键字,位于当前列的第 1 行。如果找到该关键字(即,如果SEARCH(…)返回数字;即,如果ISNUMBER(SEARCH(…))为真),它会生成关键字,前面是逗号和空格。如果找不到关键字,函数IF(…)将计算结果为空字符串。(如果您想要区分大小写的比较,请替换SEARCHFIND。)然后,无论哪种方式,结果都会连接到左侧单元格的值。这在 Column 中产生 K一个逗号分隔的关键字列表,这些关键字存在于 A当前行的 Column 中的段落中。

然后输入

=IF(K2="", "", RIGHT(K2, LEN(K2)-2))

进入E2,然后向下拖动/填充以覆盖 Column 中有数据的行 A。这表示,如果 Column 中的值为 空,则计算为空,否则从 Column 中的值的开头 K剥离。, K

这是我根据您的输入数据得到的结果图像:

电子表格
(点击查看更大图片。)

请注意,在单元格 E6( 的输出A6)中,我的解决方案按匹配关键字在 列 中出现的顺序列出它们 C,而您的插图按它们在 单元格 中出现的顺序列出它们 A6。如果这是个问题,请编辑您的问题以说明这一点,我会看看是否可以修复它。

相关内容