Страницы: 1 2 След.
RSS
Как удалить столбцы с одинаковыми словами но в разном порядке написания
 
Всем привет! Долго искал на форуме ответ, но так и не нашел, не обладаю знанием VBA к сожалению. Подскажите каким образом возможно осуществить простую на первый взгляд задумку?

Вот список запросов вордстата в екселе:

кроссовки nike shox turbo
nike кроссовки shox turbo
кроссовки nike shox
кроссовки nike turbo
кроссовки nike shox r4
shox кроссовки nike r4
кроссовки nike shox r4 eu

Как Вы заметили, строки (1,2)и(5,6) имеют идентичные слова, но в разном порядке написания.
Нужно осуществить удаление таких вот "дублированных" строк, но чтоб осталась одна из двух дублирующихся.
И чтоб не удалились другие строки, в которых эти же слова, но нет полного соответствия.
Вот так должно быть, после запуска процедуры:

кроссовки nike shox turbo
(удалилась строка)
кроссовки nike shox
кроссовки nike turbo
кроссовки nike shox r4
(удалилась строка)
кроссовки nike shox r4 eu

Заранее сильно благодарен :)
 
Можно купить у Google технологию нечеткого поиска. Или хотя бы лицензию. Дорого, но проверено...
Я сам - дурнее всякого примера! ...
 
Интересно, а можно split'ом "разбить" фразу на слова, отсортировать созданные массивы по возрастанию, например, и проводить сравнение?
 
а кто запрещает?  :D
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
To iba2004: Можно. Делал.  :)
Отсортировать, через разделитель слить и проверка полученной строки по словарю.
Изменено: Hugo - 08.08.2013 21:55:14
 
2 ikki
Привет, Саш! Я просто предположил, потому как не знаю: возможно ли это. На твой взгляд это реально?
Изменено: iba2004 - 08.08.2013 21:55:20
 
2 Hugo
Пасиба! Так у Вас есть уже этот код? Если нежалко, положите его, пожалуйста, в топик, интересно и поучительно будет посмотреть.
 
Был, но сейчас не найду.
Проще заново написать - отдельный sub на сортировку, передаём массив в параметре.
Но писать откровенно лениво и неинтересно. Да и файла нет...
И не вполне понятно - нужно именно удалять строку, или можно просто формировать новый массив без повторов - что проще и быстрее.
Можно этим массивом затереть исходный массив - будет как будто строка удалилась (но не удалилась :) ).
Изменено: Hugo - 08.08.2013 22:08:08
 
2 Hugo
понял, но всё равно, спасибо, что не остались в стороне
 
Т.е. вполне рабочий такой приём, можете потренироваться и запомнить/сохранить для других задач.
 
Не судите строго
А что мешает ТУПО посчитать ASC коды символов и сравнить?
Если символы в двух строках одинаковые то и суммы совпадут.
 
Антон, могут ведь быть разные слова из одинаковых букв. Это раз. А второе - побуквенное сравнение списка хотя бы из 1000 строк, каждая длиной 50-200 символов... Даже если сравнивать массивы слов, это уже громоздко и медленно.
Изменено: KuklP - 08.08.2013 22:21:10
Я сам - дурнее всякого примера! ...
 
Кстати, сортировка:
http://www.youtube.com/watch?v=kPRA0W1kECg&feature=youtu.be
Уже ведь почти пятница? :)
 
Приветствую Сергей
>>>Антон, могут ведь быть разные слова из одинаковых букв.
Например? %)))))))
По второму пункту выражения не большой длинны в примере...
Изменено: Watcher_1 - 08.08.2013 22:31:45
 
тоша-ашот :)
 
Hugo
Убил наповал... сдаюсь! %))))))))))))))))))))
 
Загляните:
http://files.school-collection.edu.ru/dlrstore/4f09abf4-747b-eb1f-3497-084b2fcd33b9/1009060A.htm
Я сам - дурнее всякого примера! ...
 
Ступил
Видимо праздник сегодняшний сказывается на умственный тонус  :D
 
можно так поробовать

Строка-> массив символов -> сортировка -> строка -> сравнение

если принебреч палиндромами должно работать
 
Думаю сортировать даже десяток слов будет быстрее, чем символы пары слов.
 
2 pharmaprofi
А зачем так? Массив можно "слепить" не из символов, а из слов. Отсортировать их, а затем сравнивать либо массивы поэлементно, либо сцепить все элементы и сравнить полученные выражения.
 
Еще вы не учли знаков препинания и иже с ними символов. Вот где будет веселуха  :)
Изменено: KuklP - 08.08.2013 23:03:34
Я сам - дурнее всякого примера! ...
 
2 KuklP
В примере знаки препинания не показаны.  :D  Думаю, что завтра автор почитает наши рассуждения и внесёт ясность. Всем удачи!!!
P.S.
Автор, скажите ещё, пжл, выражения могут быть ТОЛЬКО однократными или задвоенными? Затроенными, учетверёнными и.т.д. могут быть или нет?
Изменено: iba2004 - 08.08.2013 23:37:59
 
2 Hugo
Спасибо за ответ, на самом деле можно из существующего столбца перенести на соседний столбец полученный результат уже без тех самых "повторов".

Вот к примеру прикрепил файл, в нем уже есть 1709 строк заполненных слов
 
Благодарю всех за активную помощь, вношу ясность
1) Символов не будет, кроме +
2) Выражения возможно могут быть затроены в плане разброса слов К примеру:
2.1) Купить найк оптом
2.2) Найк оптом купить
2.3) Оптом найк купить
2.4) Но одинаковых ячеек уже нету таких как:
2.4.1) Найк оптом купить
2.4.2) Найк оптом купить

3) Вообще глобальная суть этой подзадачи, обыкновенный парсинг ключей маски первого и второго уровня. Дальше будет парсинг уже третьего уровня и четвертого.

4) На данном этапе важно, чтобы не было повторяющихся ключевиков-запросов. Т.е. я запарсил 5000 ключей из них таких одинаковых можно отсеить половину. Если кто знаком с яндекс.директом, то ему всё равно как стоит ключевик (купить найк оптом=найк оптом купить), поэтому нужно убрать такие из массива, для облегчения дальнейшего отсеивания.
 
move-sport
Посмотреть ваш пример не могу, у меня 2003
Если ваш список запросов начинается с А2 и ниже.
Макрос в модуль листа, где запросы.
Попробуйте
Код
Option Explicit

Sub ОдинаковыеСлова()
Dim iLastRow As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim n As Long
Dim BeginRow As Long
Dim Строка As Variant
Dim ЧислоСлов As Integer
    BeginRow = 2
    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
        For i = BeginRow To iLastRow
            Строка = Split(Trim(Cells(i, 1)), " ")
                ЧислоСлов = UBound(Строка) + 1
            For j = iLastRow To BeginRow + 1 Step -1
                If UBound(Split(Trim(Cells(j, 1)), " ")) + 1 = ЧислоСлов Then
                    n = 0
                    For k = 0 To UBound(Строка)
                        If InStr(1, Cells(j, 1), Строка(k)) <> 0 Then
                            n = n + 1
                            If n = ЧислоСлов Then Cells(j, 1).EntireRow.Delete
                        End If
                    Next
                End If
            Next
    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    BeginRow = BeginRow + 1
        Next
End Sub

 
Kuzmich
Огромное спасибо за предоставленный макрос, работает шикарно :) Ещё раз спасибо, вы уловили мысль задумки.
 
Искал подобный скрипт, спасибо Kuzmich'у!
Но есть с этим макросом проблема: в большом массиве он удаляет лишние строки.
Вот пример массива http://yadi.sk/d/NHk_PMrJHsRT2
В нем есть строки
Цитата
как подать объявление в яндекс директ
подать объявление в яндекс директ
После запуска макроса они удаляются. Возможно, не только они, но и некоторые другие строки удаляются "неправомерно". При этом ячеек со словом "подать" в массиве больше нет.
Судя по ходу скрипта, вроде бы должно все правильно работать (синтаксис я не знаю вообще, гуглил), но как получается не всегда работает.
Подскажите пожалуйста, в чем может быть проблема?


Сразу напишу тут второй вопрос.
В массиве могут попадаться фразы идентичные, но в словах могут быть разные окончания.
Например,
Цитата
настройка яндекс директ
настройка яндекс директа
Такие строки тоже нужно удалить, оставив только один вариант.
Т.е. задача в том, чтобы сначала во всем массиве в словах, содержащих 4 и более буквы, удалить последние 2 буквы (которые потенциально могут быть меняющимся окончанием), и сравнивать строки в таком виде. Но выдавать конечный результат нужно уже с окончаниями.

Буду очень благодарен, если кто-то подскажет решение этих проблем в рамках данного макроса.  :)
 
По первому вопросу попробуйте так

Код
Option Explicit

Sub ОдинаковыеСлова()
Dim iLastRow As Long
Dim i As Long
Dim j As Long
Dim k As Integer
Dim n As Long
Dim BeginRow As Long
Dim iDict As Object
Dim Строка As Variant
Dim ПодСтрока As Variant
Dim ЧислоСлов As Integer
    BeginRow = 2
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    For i = BeginRow To iLastRow
        Строка = Split(Trim(Cells(i, 1)), " ")
            ЧислоСлов = UBound(Строка) + 1
        For j = iLastRow To BeginRow + 1 Step -1
            ПодСтрока = Split(Trim(Cells(j, 1)), " ")
            If UBound(ПодСтрока) + 1 = ЧислоСлов Then
                n = 0
               
            Set iDict = CreateObject("scripting.dictionary")
               'заполняем словарь словами из массива Строка
               For k = 0 To UBound(Строка)
                    If Not iDict.Exists(Строка(k)) Then
                        iDict.Add Строка(k), 1
                    End If
               Next
               ' есть ли слова из подстроки в массиве Строка
               For k = 0 To UBound(ПодСтрока)
                    If iDict.Exists(ПодСтрока(k)) Then
                        n = n + 1
                    End If
                        If n = ЧислоСлов Then Cells(j, 1).EntireRow.Delete
               Next
            End If
       Next
    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
    BeginRow = BeginRow + 1
        Next
End Sub

 
 
Цитата
Kuzmich пишет:
По первому вопросу попробуйте так
Досконально не просмотрел, но данные фразы не удалились, из чего можно предположить, что данная версия отлично работает!
Спасибо большущее!

А 2 вопрос вообще решаем?
Страницы: 1 2 След.
Читают тему
Наверх