Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как удалить фрагменты, содержащие набор символов? - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Как удалить фрагменты, содержащие набор символов?
Jingo Дата: Среда, 15.03.2017, 11:40 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 52
Репутация: 0 ±
Замечаний: 40% ±

Excel 2007
Уважаемые, добрый день! Подскажите как решить такую задачу.

Есть xml-файл вида: (в примере ниже два однородных "объекта")

[vba]
Код
<RecordedObject>
<type>Text</type>
<tag>Pow@1398,8_27.02.2017 17:53:26</tag>
<text>1.11
+*22,90/7
</text>
<time>2017-02-27T17:53:30</time>
<price>1398.8</price>
<foreground>n:Black</foreground>
<font>Arial</font>
<fontsize>8</fontsize>
<fontstyle>0</fontstyle>
<outline>n:Red</outline>
<outline_style>Solid</outline_style>
<outline_width>1</outline_width>
<background>n:Transparent</background>
<opacity>1</opacity>
</RecordedObject>
<RecordedObject>
<type>Text</type>
<tag>Pow@1398,8_27.02.2017 17:53:26</tag>
<text>1.9
+22,90/7
</text>
<time>2017-02-27T17:53:30</time>
<price>1398.8</price>
<foreground>n:Black</foreground>
<font>Arial</font>
<fontsize>8</fontsize>
<fontstyle>0</fontstyle>
<outline>n:Red</outline>
<outline_style>Solid</outline_style>
<outline_width>1</outline_width>
<background>n:Transparent</background>
<opacity>1</opacity>
</RecordedObject>
[/vba]

Вопрос: Как удалить все "объекты" (уже средствами excel), а именно фрагменты, включая от <RecordedObject> до </RecordedObject>, внутри которых содержится определённый набор символов, например: +*22
 
Ответить
СообщениеУважаемые, добрый день! Подскажите как решить такую задачу.

Есть xml-файл вида: (в примере ниже два однородных "объекта")

[vba]
Код
<RecordedObject>
<type>Text</type>
<tag>Pow@1398,8_27.02.2017 17:53:26</tag>
<text>1.11
+*22,90/7
</text>
<time>2017-02-27T17:53:30</time>
<price>1398.8</price>
<foreground>n:Black</foreground>
<font>Arial</font>
<fontsize>8</fontsize>
<fontstyle>0</fontstyle>
<outline>n:Red</outline>
<outline_style>Solid</outline_style>
<outline_width>1</outline_width>
<background>n:Transparent</background>
<opacity>1</opacity>
</RecordedObject>
<RecordedObject>
<type>Text</type>
<tag>Pow@1398,8_27.02.2017 17:53:26</tag>
<text>1.9
+22,90/7
</text>
<time>2017-02-27T17:53:30</time>
<price>1398.8</price>
<foreground>n:Black</foreground>
<font>Arial</font>
<fontsize>8</fontsize>
<fontstyle>0</fontstyle>
<outline>n:Red</outline>
<outline_style>Solid</outline_style>
<outline_width>1</outline_width>
<background>n:Transparent</background>
<opacity>1</opacity>
</RecordedObject>
[/vba]

Вопрос: Как удалить все "объекты" (уже средствами excel), а именно фрагменты, включая от <RecordedObject> до </RecordedObject>, внутри которых содержится определённый набор символов, например: +*22

Автор - Jingo
Дата добавления - 15.03.2017 в 11:40
Roman777 Дата: Среда, 15.03.2017, 12:43 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
а замена <*> на "" (пустоту) не подойдёт?


Много чего не знаю!!!!
 
Ответить
Сообщениеа замена <*> на "" (пустоту) не подойдёт?

Автор - Roman777
Дата добавления - 15.03.2017 в 12:43
Jingo Дата: Среда, 15.03.2017, 13:39 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 52
Репутация: 0 ±
Замечаний: 40% ±

Excel 2007
а замена <*> на "" (пустоту) не подойдёт?


а какая последовательность действий?
 
Ответить
Сообщение
а замена <*> на "" (пустоту) не подойдёт?


а какая последовательность действий?

Автор - Jingo
Дата добавления - 15.03.2017 в 13:39
Roman777 Дата: Среда, 15.03.2017, 14:50 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Jingo, жмёте ctr+"H" (латинская) в графу найти "<*>" пишете, в графу "заменить на" ничего не пишете и заменяете.


Много чего не знаю!!!!
 
Ответить
СообщениеJingo, жмёте ctr+"H" (латинская) в графу найти "<*>" пишете, в графу "заменить на" ничего не пишете и заменяете.

Автор - Roman777
Дата добавления - 15.03.2017 в 14:50
Jingo Дата: Среда, 15.03.2017, 15:09 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 52
Репутация: 0 ±
Замечаний: 40% ±

Excel 2007
жмёте ctr+"H" (латинская) в графу найти "<*>" пишете, в графу "заменить на" ничего не пишете и заменяете.


а надо удалить несколько строк: (Если внутри этих тегов найдены символы)
<RecordedObject>
...
до
...
</RecordedObject>

Иными словами, если "объект" содержит символы, то он весь удаляется от <RecordedObject> до </RecordedObject>.
 
Ответить
Сообщение
жмёте ctr+"H" (латинская) в графу найти "<*>" пишете, в графу "заменить на" ничего не пишете и заменяете.


а надо удалить несколько строк: (Если внутри этих тегов найдены символы)
<RecordedObject>
...
до
...
</RecordedObject>

Иными словами, если "объект" содержит символы, то он весь удаляется от <RecordedObject> до </RecordedObject>.

Автор - Jingo
Дата добавления - 15.03.2017 в 15:09
Jingo Дата: Четверг, 16.03.2017, 22:20 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 52
Репутация: 0 ±
Замечаний: 40% ±

Excel 2007
сложная задачка?
 
Ответить
Сообщениесложная задачка?

Автор - Jingo
Дата добавления - 16.03.2017 в 22:20
SLAVICK Дата: Четверг, 16.03.2017, 23:19 | Сообщение № 7
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
сложная задачка?

Не сложная - а непонятная.
Что должно получится в итоге?
Если нужно оставить только теги - то это легко можно сделать UDFкой:
[vba]
Код
Function TB(ByVal txt$, ByVal part1$, ByVal part2$, ByVal sep$)
    On Error Resume Next
    Dim Arr, i, res$
    Select Case ""
        Case part1$ & part2$: TB = txt: Exit Function
        Case part1$: Arr = Split(txt, part2$): Arr(UBound(Arr)) = ""
        Case part2$: Arr = Split(txt, part1$): Arr(0) = ""
        Case Else: Arr = Split(txt, part1$)
            Arr(0) = ""
            For i = LBound(Arr) To UBound(Arr)
                If InStr(1, Arr(i), part2$, vbTextCompare) Then
                Arr(i) = Split(Arr(i), part2$)(0)
                End If
            Next i
    End Select
    txt = Join(Arr, sep$)
    If sep$ = "" Then TB = txt: Exit Function
    While InStr(1, txt$, sep$ & sep$, vbBinaryCompare): txt$ = Replace(txt$, sep$ & sep$, sep$): Wend
    If txt$ Like "*" & sep$ Then txt = Left(txt, Len(txt) - Len(sep$))
    If txt$ Like sep$ & "*" Then txt = Mid(txt, Len(sep$) + 1)
    TB = txt
End Function
[/vba]
Тогда формула будет:
Код
"<" & tb(A1;"<";">";"><") &">"

или
[vba]
Код
Function RegExpFindText(str As String, _
                            pattern As String, _
                            Optional Globa1 As Boolean = True, _
                            Optional IgnoreCase As Boolean = False, _
                            Optional Multiline As Boolean = False, Optional spl$ = " ") As String
Dim m() As String, i&
    Dim matches As Object 'Коллекция совпадений
    Dim match As Object 'Отдельное совпадение
    If Not pattern Like "" Then
    
        Dim REGEXP As Object 'Для регулярных выражений
        
        Set REGEXP = CreateObject("VBScript.RegExp")
        With REGEXP
            .Global = Globa1 'Находим все совпадения или только первое
            .IgnoreCase = IgnoreCase 'Учитываем ли регистр?
            .Multiline = Multiline 'Может ли паттерн попадать на разрывы строк?
            .pattern = pattern 'Выражение
        End With
        
        On Error Resume Next
        Set matches = REGEXP.Execute(str) 'Получаем коллекцию совпадений
        ReDim m(1 To matches.Count)
        Set REGEXP = Nothing 'Очистка памяти от ненужного мусора
        
        For Each match In matches
            i = i + 1
            m(i) = match.Value
'            Debug.Print match.Value
        Next
        RegExpFindText = Join(m, spl)
    End If
End Function
[/vba]
Тогда формула будет:
Код
RegExpFindText(A1;"<(\/)?\w+>";1;;1)

прочитать по RegExp можно тут и тут
см пример:
К сообщению приложен файл: 7129837-1-.xlsm (19.1 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
сложная задачка?

Не сложная - а непонятная.
Что должно получится в итоге?
Если нужно оставить только теги - то это легко можно сделать UDFкой:
[vba]
Код
Function TB(ByVal txt$, ByVal part1$, ByVal part2$, ByVal sep$)
    On Error Resume Next
    Dim Arr, i, res$
    Select Case ""
        Case part1$ & part2$: TB = txt: Exit Function
        Case part1$: Arr = Split(txt, part2$): Arr(UBound(Arr)) = ""
        Case part2$: Arr = Split(txt, part1$): Arr(0) = ""
        Case Else: Arr = Split(txt, part1$)
            Arr(0) = ""
            For i = LBound(Arr) To UBound(Arr)
                If InStr(1, Arr(i), part2$, vbTextCompare) Then
                Arr(i) = Split(Arr(i), part2$)(0)
                End If
            Next i
    End Select
    txt = Join(Arr, sep$)
    If sep$ = "" Then TB = txt: Exit Function
    While InStr(1, txt$, sep$ & sep$, vbBinaryCompare): txt$ = Replace(txt$, sep$ & sep$, sep$): Wend
    If txt$ Like "*" & sep$ Then txt = Left(txt, Len(txt) - Len(sep$))
    If txt$ Like sep$ & "*" Then txt = Mid(txt, Len(sep$) + 1)
    TB = txt
End Function
[/vba]
Тогда формула будет:
Код
"<" & tb(A1;"<";">";"><") &">"

или
[vba]
Код
Function RegExpFindText(str As String, _
                            pattern As String, _
                            Optional Globa1 As Boolean = True, _
                            Optional IgnoreCase As Boolean = False, _
                            Optional Multiline As Boolean = False, Optional spl$ = " ") As String
Dim m() As String, i&
    Dim matches As Object 'Коллекция совпадений
    Dim match As Object 'Отдельное совпадение
    If Not pattern Like "" Then
    
        Dim REGEXP As Object 'Для регулярных выражений
        
        Set REGEXP = CreateObject("VBScript.RegExp")
        With REGEXP
            .Global = Globa1 'Находим все совпадения или только первое
            .IgnoreCase = IgnoreCase 'Учитываем ли регистр?
            .Multiline = Multiline 'Может ли паттерн попадать на разрывы строк?
            .pattern = pattern 'Выражение
        End With
        
        On Error Resume Next
        Set matches = REGEXP.Execute(str) 'Получаем коллекцию совпадений
        ReDim m(1 To matches.Count)
        Set REGEXP = Nothing 'Очистка памяти от ненужного мусора
        
        For Each match In matches
            i = i + 1
            m(i) = match.Value
'            Debug.Print match.Value
        Next
        RegExpFindText = Join(m, spl)
    End If
End Function
[/vba]
Тогда формула будет:
Код
RegExpFindText(A1;"<(\/)?\w+>";1;;1)

прочитать по RegExp можно тут и тут
см пример:

Автор - SLAVICK
Дата добавления - 16.03.2017 в 23:19
Jingo Дата: Пятница, 17.03.2017, 00:04 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 52
Репутация: 0 ±
Замечаний: 40% ±

Excel 2007
Приведу иной пример; имеем 4 "объекта":

<tag>
abracadabra1.1
abracadabra1.2
</tag>

<tag>
*abracadabra2.1
abracadabra2.2
</tag>

<tag>
abracadabra3.1
abracadabra34
</tag>

<tag>
*a111111111
abracadabra4
</tag>

Надо найти и удалить объекты содержащие к примеру "*a". В итоге должно остаться:

<tag>
abracadabra1.1
abracadabra1.2
</tag>

<tag>
abracadabra3.1
abracadabra34
</tag>
 
Ответить
СообщениеПриведу иной пример; имеем 4 "объекта":

<tag>
abracadabra1.1
abracadabra1.2
</tag>

<tag>
*abracadabra2.1
abracadabra2.2
</tag>

<tag>
abracadabra3.1
abracadabra34
</tag>

<tag>
*a111111111
abracadabra4
</tag>

Надо найти и удалить объекты содержащие к примеру "*a". В итоге должно остаться:

<tag>
abracadabra1.1
abracadabra1.2
</tag>

<tag>
abracadabra3.1
abracadabra34
</tag>

Автор - Jingo
Дата добавления - 17.03.2017 в 00:04
gling Дата: Пятница, 17.03.2017, 00:39 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2640
Репутация: 737 ±
Замечаний: 0% ±

2010
Здравствуйте. Было бы луче увидеть этот кусочек данных в файле. Эти группы размещены в одной ячейки или каждая строчка в отдельной ячейке?В первом примере нет разделения как во втором, пустая ячейка между группами. Всегда по разному может быть?


ЯД-41001506838083
 
Ответить
СообщениеЗдравствуйте. Было бы луче увидеть этот кусочек данных в файле. Эти группы размещены в одной ячейки или каждая строчка в отдельной ячейке?В первом примере нет разделения как во втором, пустая ячейка между группами. Всегда по разному может быть?

Автор - gling
Дата добавления - 17.03.2017 в 00:39
Jingo Дата: Пятница, 17.03.2017, 09:36 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 52
Репутация: 0 ±
Замечаний: 40% ±

Excel 2007
Здравствуйте. Было бы луче увидеть этот кусочек данных в файле. Эти группы размещены в одной ячейки или каждая строчка в отдельной ячейке?В первом примере нет разделения как во втором, пустая ячейка между группами. Всегда по разному может быть?


Доброе утро. Прикрепил csv-файл с данными из текста xml-файла.

Открывающий и закрывающий тег объекта: <RecordedObject> и </RecordedObject>

Задача: поиск+удаление всех объектов, содержащих те или иные символы.
К сообщению приложен файл: example.xlsb (12.3 Kb)


Сообщение отредактировал Jingo - Пятница, 17.03.2017, 09:36
 
Ответить
Сообщение
Здравствуйте. Было бы луче увидеть этот кусочек данных в файле. Эти группы размещены в одной ячейки или каждая строчка в отдельной ячейке?В первом примере нет разделения как во втором, пустая ячейка между группами. Всегда по разному может быть?


Доброе утро. Прикрепил csv-файл с данными из текста xml-файла.

Открывающий и закрывающий тег объекта: <RecordedObject> и </RecordedObject>

Задача: поиск+удаление всех объектов, содержащих те или иные символы.

Автор - Jingo
Дата добавления - 17.03.2017 в 09:36
SLAVICK Дата: Пятница, 17.03.2017, 10:07 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
В итоге должно остаться:

Так бы сразу и сказали.
Можно при помощи тех же регулярок:
[vba]
Код
Function RegExpReplace_(ByVal WhichString As String, _
                        ByVal pattern As String, _
                        Optional ByVal ReplaceWith As String = " ", _
                        Optional ByVal IsGlobal As Boolean = True, _
                        Optional ByVal IsCaseSensitive As Boolean = True) As String
'Функция по регулярному выражению (маске) возвращает результат
'Declaring the object
Dim objRegExp As Object
'Initializing an Instance
Set objRegExp = CreateObject("vbscript.regexp")
'Setting the Properties
objRegExp.Global = IsGlobal
objRegExp.pattern = pattern
objRegExp.IgnoreCase = Not IsCaseSensitive
'Execute the Replace Method
RegExpReplace_ = objRegExp.Replace(WhichString, ReplaceWith)
End Function
[/vba]
Формула:
Код
RegExpReplace_(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A5;СИМВОЛ(10);"");"><";">"&СИМВОЛ(10)&"<");"(<\w+>)(.+)?(\*a)(.+)?(<\/\w+>)";;1;0)


Блин пока писал - новый пример появился Сразу нельзя было его вложит? >( .
Прикрепил csv-файл с данными из текста xml-файла

Тогда объединяйте текст в одну ячейку - тогда будет работать мой пример выше.
К сообщению приложен файл: 4895456.xlsm (20.5 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
В итоге должно остаться:

Так бы сразу и сказали.
Можно при помощи тех же регулярок:
[vba]
Код
Function RegExpReplace_(ByVal WhichString As String, _
                        ByVal pattern As String, _
                        Optional ByVal ReplaceWith As String = " ", _
                        Optional ByVal IsGlobal As Boolean = True, _
                        Optional ByVal IsCaseSensitive As Boolean = True) As String
'Функция по регулярному выражению (маске) возвращает результат
'Declaring the object
Dim objRegExp As Object
'Initializing an Instance
Set objRegExp = CreateObject("vbscript.regexp")
'Setting the Properties
objRegExp.Global = IsGlobal
objRegExp.pattern = pattern
objRegExp.IgnoreCase = Not IsCaseSensitive
'Execute the Replace Method
RegExpReplace_ = objRegExp.Replace(WhichString, ReplaceWith)
End Function
[/vba]
Формула:
Код
RegExpReplace_(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A5;СИМВОЛ(10);"");"><";">"&СИМВОЛ(10)&"<");"(<\w+>)(.+)?(\*a)(.+)?(<\/\w+>)";;1;0)


Блин пока писал - новый пример появился Сразу нельзя было его вложит? >( .
Прикрепил csv-файл с данными из текста xml-файла

Тогда объединяйте текст в одну ячейку - тогда будет работать мой пример выше.

Автор - SLAVICK
Дата добавления - 17.03.2017 в 10:07
Jingo Дата: Пятница, 17.03.2017, 12:41 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 52
Репутация: 0 ±
Замечаний: 40% ±

Excel 2007
спасибо большое! почти получилось решение, только вот всё слилось в единую строку, а в исходнике текст с переносом


Сообщение отредактировал Jingo - Пятница, 17.03.2017, 12:41
 
Ответить
Сообщениеспасибо большое! почти получилось решение, только вот всё слилось в единую строку, а в исходнике текст с переносом

Автор - Jingo
Дата добавления - 17.03.2017 в 12:41
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!