我有一份来自我正在监控的用户的约 1000 条推文列表。我希望能够跟踪有多少独特的用户提及(即出现@anyUserName
)在字符串内。
每条推文都存储在一个单元格中。我希望能够从单元格中提取 @variable-length 字符串。
已经有几天了,如果能提供任何帮助我将非常感激。
谢谢
答案1
现在,查看您的数据,如果您想从每条推文中提取多个@,那么每个实例都必须有一列:
=IFERROR(MID($A2,FIND("|",SUBSTITUTE($A2,"@","|",B$1)),IFERROR(FIND(" ",$A2,FIND("|",SUBSTITUTE($A2,"@","|",B$1))),LEN($A2)+1)-FIND("|",SUBSTITUTE($A2,"@","|",B$1))),"")
将其放入 B2,然后抄下来。
这看起来令人难以接受,但 temporarity 会将第 n 个 @ 替换为不同的字符(不太可能在推文中使用的字符,即竖线“|”),然后找到该位置及其后的下一个空格。如果后面没有空格,它会将名称作为推文中的最后一个内容。
在此示例中,您的推文位于 A 列第 2 行(假设标题是第 1 行)。您可以将此公式放在 B2 中,并根据需要复制到右侧的任意列。它期望您的标题是要提取的名称。像这样:
答案2
这是一个 VBA 解决方案。只需将以下代码粘贴到模块中(按Alt+F11并转到 Insert
>> Module
)。选择您的推文列表并执行(通过F5从 VBA 编辑器窗口按)。
Sub getUniqueUsers()
Dim r As Range, users As Object, Tweets() As Variant, ns As Worksheet
Dim i As Long, j As Long, k As Long
Dim rgx As Object, Matches As Object, M As Object, key As Variant
Set r = Selection
'Load tweets into array for fast processing
Tweets = r.Value
'create scripting objects
Set users = CreateObject("Scripting.dictionary")
Set rgx = CreateObject("vbscript.regexp")
rgx.MultiLine = True
rgx.Pattern = "(^| )(@[^ \t]+)"
'Check each tweet for user mentions with regular expression matching. Add all matches to dictionary.
For j = LBound(Tweets, 2) To UBound(Tweets, 2)
For i = LBound(Tweets, 1) To UBound(Tweets, 1)
Set Matches = rgx.Execute(Tweets(i, j))
For Each M In Matches
If Not users.exists(M.submatches.Item(1)) Then
users.Add M.submatches.Item(1), M.submatches.Item(1)
End If
Next M
Next i
Next j
'Output list to new sheet
Set ns = Worksheets.Add
ns.Name = "Unique User Mentions"
k = 1
For Each key In users
ns.Range("A" & k).Value = key
k = k + 1
Next key
End Sub
此代码使用正则表达式和字典脚本对象。它将在每条推文中找到用户提及并将其存储在字典中。字典用于确保唯一性。最后,唯一用户提及将打印在新工作表的 A 列中。