Страницы: 1
RSS
Удаление всех дубликатов слов в колонке документа csv файла
 
Добрый день

Подскажите пожалуйста, как удалять дубли слов в колонке ?  (кроме как в ручную :) )
Каким механизмом лучше воспользоваться?
 
На листе в csv файле есть две колонки , первая колонка названия файлов, вторая колонка с ключевыми словами  через запятую, необходимо чтобы все дубликаты ключевых слов в колонке B:B
(вторая колонка) были удалены. Количество ключевых слов в ячейке до 50 и это значение для каждого файла разное. Также количество файлов, тоесть строк тоже разное и обычно до 100.

Есть такой код VBA для удаления дубликатов слов в ячейке, но мне необходимо для всего активного листа или как выше писал для колонки B:B :
Код
Sub a________RemoveDups_in_select_cell()
    Dim r As Range, s As String, arr
    Dim c As Collection

    For Each r In Selection
        Set c = New Collection
        arr = Split(r.Value, " ")
        For i = LBound(arr) To UBound(arr)
            On Error Resume Next
                c.Add arr(i), CStr(arr(i))
            On Error GoTo 0
        Next i

        s = ""
        For i = 1 To c.Count
            s = s & " " & c.Item(i)
        Next i
        If Left(s, 1) = " " Then s = Mid(s, 2)
        r.Value = s
    Next r
End Sub
Изменено: seregasss435 - 31.05.2020 14:03:19
 
Цитата
seregasss435 написал: 21 Май 2020 17:11:08
31 Май 2020 10:27:40
А воз и ныне там.
 
seregasss435, код следует оформлять соответствующим тегом. Ищите такую кнопку (см. скрин) и исправьте своё сообщение.
И не вижу реакции на замечание модератора.по поводу названия  темы.
 
Просьба к модератору поменять название темы на :
Удаление всех дубликатов слов на листе документа csv файла с помощью макроса
 
Доброе время суток
Цитата
seregasss435 написал:
для колонки B:B
Вариант
Код
Public Sub RemoveDubs()
    Dim pDict As Object, vData As Variant
    Dim i As Long, LRow As Long
    LRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row
    vData = ActiveSheet.Range(ActiveSheet.Cells(1, 2), ActiveSheet.Cells(LRow, 2)).Value
    Set pDict = CreateObject("Scripting.Dictionary")
    For i = LBound(vData) To UBound(vData)
        If Not IsEmpty(vData(i, 1)) Then
            vData(i, 1) = Join(GetNonDictItems(vData(i, 1), pDict), ",")
        End If
    Next
    ActiveSheet.Range(ActiveSheet.Cells(1, 2), ActiveSheet.Cells(LRow, 2)).Value = vData
End Sub

Private Function GetNonDictItems(ByVal baseText As String, ByVal pDict As Object)
    Dim subStrs() As String, k As Long, nonDict As Object
    Set nonDict = CreateObject("Scripting.Dictionary")
    subStrs = Split(baseText, ",")
    For k = LBound(subStrs) To UBound(subStrs)
        If Not pDict.Exists(subStrs(k)) Then
            nonDict(subStrs(k)) = Empty
            pDict(subStrs(k)) = Empty
        End If
    Next
    GetNonDictItems = nonDict.Keys
End Function
 
Кнопка цитирования не для бездумного нажатия [МОДЕРАТОР]

Андрей VG, Крутяк работает, только не удаляет те дубли что с запятой и без запятой они воспринимаються как не дубли: если в начале и в середине "tag1," то в конце строки tag1 не удаляет и если в конце строки "tag2" то в последующих строках не находит "tag2,".
 
Цитата
seregasss435 написал: только не удаляет те дубли
а где доказательства сего безобразия? Похоже на облыжное высказывание.
 
ПРИНОШУ СВОИ ИЗВИНЕНИЯ, действительно работает как надо, после взятия на тест рабочих а не тестовых файлов и повторных проб все работает в отличие от первого запуска.

Еще раз спасибо
 
Цитата
Андрей VG написал: Вариант
Здрайствуйте,

Подскажите пожалуйста, что поменять в коде для того чтобы поиск и удаление дубликатов происходил не по порядку слов в ячейке (слева на право) и столбца (сверху вниз), а по важности слов (первое слово для файла самое важное и макрос ищет дубликаты сначала среди первых слов, потом среди вторых, третьих и т. д. ) - это важно так как этот макрос являеться частью другого макроса который потом оставляет суммарное количество слов равное 50, 30 или иное количиество слов из всех слов что в столбце B:B и они будут объединяться моим макросом и должны распологаться в порядке приоритета важности от наийвысшего к наименьшему. Не должно быть так, что если для первого файла в ячейке B2 слово hospital находиться на 10-й позиции , а у второго файла в ячейке B3 hospital  это слово на 1-й позии , то оно будет удалено в первой позиции, а не в 10-й. Это первое слово данной ячейки B3 не должно быть удалено за исключением того случая если в верхней ячейке такое же слово находиться на той же позиции.
Исходя из примера важно чтобы слово hospital попало на 2-у позицию суммарных слов так как это первое слово второй ячейки B3 столбца B:B.
 
Цитата
seregasss435 написал:
а по важности слов (первое слово для файла самое важное и макрос ищет дубликаты сначала среди первых слов, потом среди вторых, третьих и т. д. )
И где тогда демонстрация подобной важности, тех самых файлов, того что должно получиться на выходе? Предлагаете создавать самостоятельно, уж если задача показалась отвечающему столь интересной, и требуется отлаживать код, сверяясь с тем, что должно получиться в результате? А если не получиться угадать тот результат, то быть готовым к переделкам?  ;)
Изменено: Андрей VG - 05.06.2020 23:21:57
 
Во вложение файл  sample.xlsx в котором контент как было и как должно стать, а sample_forCSV.csv рабочий файл.
 
Где интересно верно
Цитата
seregasss435 написал: sample_forCSV.csv рабочий файл.
или
Цитата
для первого файла в ячейке B2 слово hospital находиться на 10-й позиции , а у второго файла
подразумевающего минимум два файла? И, следовательно, пример того, что должно получиться для двух файлов.
Алгоритм становиться двухпроходным. Сначала в словарь собираются по ключу слову Collection номеров строк, а по результатам анализа, возможно с учётом нумерации файлов на неизвестном порядке, какой из них первый, какой второй, принимается решение в каких позициях должны быть исключены повторы слов. Так как-то.
Ну, или, если правильно уловил смысл, то обрабатывать каждый файл на дубликаты по отдельности, потом сливая результаты.
 
Андрей VG, это два разных образца об одном и том же .  Обрабатываеться один файл и для простоты восприятия специально для вас я и создал sample.xlsx в котором красным выделено то что актуально для поиска, а csv файл: sample_forCSV.csv  для обработки как рабочая версия (в xlsx в отличие от csv сохраняеться форматирование).С
hospital это первый пример, а tag10 это уже другой но аналогичный. Каждый файл по отдельности на дубликаты не надо проверять, надо проверять по отдельности каждое слово начиная с первых позиций всех файлов и в порядке убывания слов для каждого файла по всему наличию слов. Порядок поиска дубликатов и удаления следующий:
tag1,tag10,slovo1,tag2,keyword2,slovo2,tag3,keyword3,slovo3,tag4,keyword4,slovo4,tag5,keyword5,tag10,tag6,keyword6,slovo6,
tag7,keyword7,slovo7,tag8,keyword8,slovo8,tag9,keyword9,slovo9,tag10,keyword10,slovo10
Страницы: 1
Наверх