1

У меня есть список ~ 1000 твитов от пользователя, которого я отслеживаю. Я хотел бы иметь возможность отслеживать, сколько уникальных пользовательских упоминаний (то есть, появления @anyUserName) в строках.

Каждый твит хранится в одной ячейке. Я хочу быть в состоянии извлечь строку @ переменной длины из ячейки.

Побывав пару дней на этом, буду признателен за любую помощь.

Спасибо

2 ответа2

3

Вот решение VBA. Просто вставьте следующий код в модуль (нажмите Alt+F11 и перейдите к Insert >> Module). Выберите свой список твитов и выполните (нажав F5 в окне VBA Editor).

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

Этот код использует объекты регулярных выражений и сценариев словаря. Он найдет упоминания пользователя в каждом твите и сохранит их в словаре. Словарь используется для обеспечения уникальности. Наконец, уникальные упоминания пользователя напечатаны в столбце А на новом листе.

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, и скопируйте вниз и снова.

Это выглядит ошеломляюще, но временность заменяет n-й экземпляр @ другим символом (который вряд ли будет использоваться в твите, в трубе "|"), а затем находит это местоположение и следующий пробел после. Если после этого нет места, оно обрабатывает имя, являющееся последним в сообщении.

В этом примере ваши твиты находятся в столбце A, начиная со строки 2 (предположим, заголовок - это строка 1). Вы можете поместить эту формулу в B2 и скопировать вправо столько столбцов, сколько вам нужно. Он ожидает, что ваш заголовок будет тем именем, которое нужно извлечь. Как это:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .