我在 excel 中有一列期刊文章标题,我需要从中提取认知概念或技术术语。预处理部分之一包括删除常用但不代表概念的缩写,例如 NGC 代表新总目录或 VLA 代表天文学中的甚大阵列。几乎所有这些缩写都是 3 个字母的单词,全部大写。有没有办法删除这些词?我在 excel 中安装了 Kutools,如果这很重要的话。
编辑:我附上了一些标题的图片。所有标题都在一列中,每个标题在一个单元格中。在附图中,我想删除 AWM、ESO、SFI、NGC。这里不需要区分常用缩写和技术术语,除了在我的情况下,技术术语需要是单词或短语。即使这些缩写有意义,它们也不代表我的数据中的概念,因此需要删除,以免由于它们的频率而歪曲数据分析。
答案1
老实说,VBA 方法可能更简单,但无论如何我都喜欢了解在 PowerQuery 中是否可以实现这些功能!
答案是肯定的!我将您的文本复制到表格中,并将列标题设为“数据”。
然后,此查询从文本中删除 TLA:
let
Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed type from mixed to text" = Table.TransformColumnTypes(Source,{{"data", type text}}),
#"Added Index to enable split/apply/combine" = Table.AddIndexColumn(#"Changed type from mixed to text", "Index", 0, 1),
#"Split each sentence by space onto new rows" = Table.ExpandListColumn(Table.TransformColumns(#"Added Index to enable split/apply/combine", {{"data", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "data"),
#"Add a column to identify Three-Letter-Acronyms (TLA)" = Table.AddColumn(#"Split each sentence by space onto new rows", "TLA", each Text.Length([data])=3
and Text.Upper([data]) = [data]
and Value.Is(Value.FromText([data]), type text)),
#"Filter the rows so that TLAs are hidden" = Table.SelectRows(#"Add a column to identify Three-Letter-Acronyms (TLA)", each ([TLA] = false)),
#"Hide the TLA column (it's no longer needed)" = Table.RemoveColumns(#"Filter the rows so that TLAs are hidden",{"TLA"}),
#"Group by index, concat. text using space delimiter" = Table.Group(#"Hide the TLA column (it's no longer needed)", {"Index"}, {{"data", each Text.Combine([data]," "), type text}}),
#"Remove the index" = Table.RemoveColumns(#"Group by index, concat. text using space delimiter",{"Index"})
in
#"Remove the index"
完成后,它看起来像这样:
几乎所有这些都可以通过 UI 完成,除了 Group By 步骤,您需要先按索引分组并对数据求和,这当然会产生错误,然后在高级编辑器中编辑查询以将 Sum 操作更改为以Text.Combine
空格作为分隔符。
答案2
答案3
您可以使用 VBA 代码来实现此目的:
Sub Calc()
Dim intC As Integer
Dim objR As Object
Set objR = CreateObject("VBScript.regexp")
With objR
.Pattern = ".*[A-Z]{3}.*"
.IgnoreCase = False
End With
intC = 10 ' MAKE SURE TO REPLACE 10 WITH THE LAST CELL NUMBER OF YOUR COLUMN
For i = 1 To intC
If objR.Test(Range("A" & i).Value) Then
Range("A" & 1).Value = ""
End If
Next
End Sub