Страницы: 1 2 След.
RSS
удалить из ячейки все символы, кроме кириллицы
 
Всем здравствуйте.
У меня есть файл в котором, необходимо отредактировать столбцы "описание" и "краткое описание". В этих ячейках содержится html код и следы правки редактором word...Что удалять, а что оставлять определить сложно. Приходится смотреть каждую ячейку.
Я смирился, что html код мне не восстановить...
Подскажите, как мне удалить все знаки, кроме кириллицы?
Отправляю пример. А вообще файл на 100000 строк. Вручную перелопатить нереально.
Помогите, пожалуйста!
 
rafa_el, здравствуйте! Ознакомьтесь.
Тема многократно обсуждалась. Погуглили бы…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Ваша ссылка ведет на ОБРАТНУЮ тему. ТС нужно ОСТАВИТЬ кирилицу
Согласие есть продукт при полном непротивлении сторон
 
Цитата
удалить из ячейки все символы, кроме кириллицы
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=81622
 
Sanja, оно, конечно так, но ведь остаётся только заменить "Like" на "Not like"? — не работает))) ща…

2017-09-12. Надо было не "If переменная Not like", а "If Not переменная Like" )))) см. пост №12
Изменено: Jack Famous - 12.09.2017 11:38:20
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Я с макросами не умею работать...(прошу камнями не кидаться)
Пытался сейчас записать макрос и вставить в него:
Код
Dim i&, z: z = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).Row).ValueWith CreateObject("VBScript.RegExp"):  .Pattern = "[а-яёА-ЯЁ/\s]+"
      For i = 1 To UBound(z)
           If .test(z(i, 1)) Then z(i, 1) = .Execute(z(i, 1))(0)
       Next
  Range("A1").Resize(UBound(z), 1).Value = z
End With
End Sub

Данный код прописал в visual basic и данная формула действительно работает с ячейками типа
"задача zadacha"-> задача
Но не работает с содержимым моих ячеек  :)
Не хотел засорять эфир...вот содержимое одной из ячеек:
Скрытый текст

Должно остаться из всего этого Домино Принцессы

Посмотрите образец, пожалуйста.
Я честно гуглил и яндексил, но моей компетенции не хватило на решение данного вопроса.
 
rafa_el, длинные сообщения прячьте под спойлер.
 
Проще сделать через =ПОДСТАВИТЬ(ПСТР(I10;НАЙТИ("MsoNormal";I10;1)+ДЛСТР("MsoNormal")+2;50);"</p>";"")
в этой формуле подразумевается, что Ваш текст в ячейке I10
 
Код
Sub OnlyCirilic()
Dim I&, J&
Dim Z()
Z = Range("J2:K" & Cells(Rows.Count, "J").End(xlUp).Row).Value
With CreateObject("VBScript.RegExp")
    .Global = True
    .IgnoreCase = True
    .Pattern = "[а-яА-ЯёЁ ]+"
    For I = 1 To UBound(Z)
        For J = 1 To UBound(Z, 2)
            If .Test(Z(I, J)) Then
                Z(I, J) = .Execute(Z(I, 1))(0)
            Else
                Z(I, J) = Empty
            End If
        Next
    Next
    Range("J2").Resize(UBound(Z), 2).Value = Z
End With
End Sub
Изменено: Sanja - 11.09.2017 19:55:41
Согласие есть продукт при полном непротивлении сторон
 
Konstantin Zhi, Sanja, спасибо!
Sanja, ваше решение убирает все знаки после  "первой встречи" с кириллицей. Но...последующую кириллицу он то же удаляет.
Konstantin Zhi, ваше решение не убирает латиницу после "второй встречи" с ней, которая начинается не с "MsoNormal"

Например файл в приложении...
 
Я лишь показал альтернативный вариант, а не готовое решение. Готовым решением та формула может стать, если знать структуру текста и на ее основе (структуры) написать формулу
 
Я тут решил немного исправиться (т.к. не совет был неполный) и всё-таки рассмотреть предложенный мной в посте №2 вариант UDF (в скорректированном виде).
UDF
Изменено: Jack Famous - 12.09.2017 11:47:35
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Добавлю свой вариант:
Код
Function Cir(rng As Range) As String
    Dim i As Integer, s As String: s = rng.Value
    For i = 0 To 191
        If i <> 32 Then s = Replace(s, Chr(i), " ")
    Next
    Cir = Application.Trim(s)
End Function
Проверяйте.
Чем шире угол зрения, тем он тупее.
 
SAS888,  премного благодарен!
То что нужно.  8)
Спасибо всем тем кто отозвался на эту тему. Есть же еще добрые люди. Понял, что пора изучать макросы...
Надеюсь эта тема поможет другим юзерам. Отличительная особенность задачи-большой объем знаков в одной ячейке. Слова кириллицей остались  с пробелами.
Тему можно закрывать.
 
Цитата
rafa_el написал:
Слова кириллицей остались  с пробелами
что это значит? В моём варианте никаких пробелов нет — все убираются.
Вариант
Изменено: Jack Famous - 12.09.2017 15:59:56
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
SAS888 написал:
Проверяйте.
буквы Ё и ё не проходят:)
«Бритва Оккама» или «Принцип Калашникова»?
 
Раз отметился в этой теме - решил набросать свой вариант. Не изменяя своим привычкам - заточен на производительность.
Итак начнем на массиве 5 тыс. строк (просто размножил до нужного диапазона - предлагаемый здесь эталон).
Вариант от Jack Famous,
Скрытый текст

Простой и понятный, но с тяжелыми строковыми функциями - 230 секунд.

Вариант  от SAS888,
Скрытый текст
строковых функций меньше - результат 40 секунд - неплохо :)

мой вариант: немного развернул условия проверки, т.к. VBA, насколько я знаю не делает оптимизации логических операций (в отличии например от С-подобных языков), поэтому немного больше кода (есть еще куда оптимизировать, но не стал + не стал разворачивать до отдельного условия, - решил. что в данном случае - большой листинг пугает пользователей :) ).
Работа только с массивами и целыми числами - 7 секунд. на массив 5 тыс. строк
Код
Public Function КИРИЛЛИЦА(строка As String) As String
Dim C() As Byte, y As Long, x As Long, Z As Long, CK() As Byte
C = строка
ReDim CK(0 To UBound(C))
For x = 0 To UBound(C) - 1 Step 2 'только русский алфавит, Ё,ё + пробел
    If C(x + 1) = 4 Then
        If (C(x) > 15 And C(x) < 80 Or C(x) = 1 Or C(x) = 81) Then
        Z = Z + 1: If Z <> 1 Then y = y + 2
        CK(y + 1) = C(x + 1)
        CK(y) = C(x)
        End If
    ElseIf C(x + 1) = 0 Then
        If C(x) = 32 Then
            If CK(y + 1) <> 0 Or CK(y) <> 32 Then
            Z = Z + 1: If Z <> 1 Then y = y + 2
            CK(y + 1) = C(x + 1)
            CK(y) = C(x)
            End If
        End If
    End If
Next
ReDim Preserve CK(0 To y + 1)
КИРИЛЛИЦА = Trim(CK)
End Function
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, как всегда подробно и очень круто!  8)
Я вот очень мало, конечно, разбираюсь в VBA, поэтому подскажите — разве VBAшный Trim (в отличие от функции листа) не только ли внутренние пробелы обрезает? Как же тогда быть с ведущими и хвостовыми?
Изменено: Jack Famous - 13.09.2017 12:37:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, , Функции Trim, LTrim и RTrim
Возвращает строку, содержащую копию указанной строки без начальных пробелов (LTrim), без конечных пробелов (RTrim), или без начальных или замыкающих пробелов (Trim).
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, наоборот сказал))) а что тогда с пробелами внутри строки?) или в этом случае это не нужно (почти не понимаю код)  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
пробелы собираются вторым блоков проверки
Код
    ElseIf C(x + 1) = 0 Then
        If C(x) = 32 Then...
, т.к. в байтовом массиве они кодируются как 00-32, т.е. двойные и более пробелы превращаются в одинарный.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, высший пилотаж))) большое спасибо за подробные объяснения!)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Пользуйтесь на здоровье! :)
Приложил пример для наглядности.
Изменено: bedvit - 13.09.2017 13:39:28
«Бритва Оккама» или «Принцип Калашникова»?
 
Доброе время суток.
Цитата
bedvit написал:
Работа только с массивами и целыми числами - 7 секунд. на массив 5 тыс. строк
bedvit, попаразитировал на вашем решении, чуть под ускорил. Ваша на 5000 8,85 секунды, моя версия 7,34
P. S. А если заточить проверку под тестовую строку, то и 6,35
Изменено: Андрей VG - 13.09.2017 22:10:02
 
Андрей VG, приветствую! Проверил без макросов, секундомером)) 20,61 против 25,46 на 10к ячеек в вашу пользу. С моей функцией ваще полная опа — уходит в недели  :D
А если стандартным Replace'ом заменять - как отразится на скорости? А то я ваши коды не понимаю
Изменено: Jack Famous - 14.09.2017 11:38:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Андрей VG, хорошая оптимизация, и обращения к переменной, а не к массиву, и проверка пробелов, и запись в тот же массив. Будут еще идеи и время гляну что еще можно сделать, есть один чит :)
«Бритва Оккама» или «Принцип Калашникова»?
 
Уважаемые Андрей VG, bedvit и SAS888!
Подскажите пожалуйста (каждый по своему коду и по-возможности), что изменится в коде при изменении списка сохраняемых/удаляемых символов?
Я так понял, вы привязываетесь и проверяете числовые коды символов… Но вот, как и что будет меняться — не понимаю((
Изменено: Jack Famous - 14.09.2017 12:38:46
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, мой алгоритм разбирает строку в байтовый массив, каждый символ - два байта в кодировке Unicode в десятичном представлении. И с массивом целых чисел работает, что очень быстро по сравнению с работой со строками. Формируется новый байтовый массив (заполняется старый) и выводится в строку итог (найденные нужные символы). Этим алгоритмом можно отсеивать или собирать любые символы Unicode довольно быстро.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, большое спасибо за объяснение — буду разбираться, т.к. очень крутое ускорение получается. Буду признателен за ссылки (начал с таблицы кодировок Unicode) по итогам отпишусь в этот пост.
У меня затык))))
Изменено: Jack Famous - 14.09.2017 15:00:14
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Оптимизация от Андрей VG настолько хороша, что пришлось написать свою библиотеку.
К сожалению сейчас не знаю хорошего инструментария кроме Microsoft Visual Studio Community 2017+С#+Excel-DNA, поэтому библиотека с обертками получилась размером за границами вложений для нашего форума. Прилагаю данные (файл Excel) по ссылке (где создал тему с нужным нам примером).
Теперь о приятном :)
Открыв фал и запустив два теста, можно посмотреть, что функция RUS, в 2,8 раза быстрее (2 сек против 5,6 сек.), при условии что обертка отжирает 30%!
Попробовал поделить по потокам (8 ядер), но из-за размера (небольшого) входящей строки - профита нет. Поэтому однопоточная библа. В файле 2 библиотеки разрадностью х32 или х64 - автоматом выбирается и  распаковывается нужная.
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 След.
Наверх