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

Вход

Регистрация

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

 

= Мир MS Excel/Разделить текст на части игнорируя разделители в кавычках - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Разделить текст на части игнорируя разделители в кавычках
Неопытный Дата: Вторник, 17.09.2013, 23:36 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 23
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Необходимо разложить элементы текста из файла xml,расположенные в столбце "А" по столбцам, начиная с "B". Элементы в строках разделены строго одним пробелом, можно было бы элементы разложить по разделителю "пробел", но в тексте,заключенном в кавычках может быть разное количество пробелов и их как-то надо игнорировать, т.е. ориетироваться только на пробелы между элементами. В тексте, который в кавычках, должно остаться по одному пробелу между словами,а если число в кавычках,то там пробелов не должно остаться. Текст в кавычках является частью элемента и он должен остаться в элементе. Как это сделать попроще в VBA, что посоветуете?
Пример с макросом прилагается.
К сообщению приложен файл: 6538791.rar (10.6 Kb)


Сообщение отредактировал Неопытный - Вторник, 17.09.2013, 23:38
 
Ответить
СообщениеНеобходимо разложить элементы текста из файла xml,расположенные в столбце "А" по столбцам, начиная с "B". Элементы в строках разделены строго одним пробелом, можно было бы элементы разложить по разделителю "пробел", но в тексте,заключенном в кавычках может быть разное количество пробелов и их как-то надо игнорировать, т.е. ориетироваться только на пробелы между элементами. В тексте, который в кавычках, должно остаться по одному пробелу между словами,а если число в кавычках,то там пробелов не должно остаться. Текст в кавычках является частью элемента и он должен остаться в элементе. Как это сделать попроще в VBA, что посоветуете?
Пример с макросом прилагается.

Автор - Неопытный
Дата добавления - 17.09.2013 в 23:36
anvg Дата: Среда, 18.09.2013, 04:12 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Где-то так
[vba]
Код

Public Sub SplitNodeAttributes()
     Dim vOut() As Variant, vIn As Variant
     Dim LRow As Long, pSheet As Worksheet
     Dim pReg As Object, pMatch As Object
     Dim iRow As Long, iCol As Long, sVal As String
      
     Set pSheet = ActiveSheet: LRow = pSheet.Cells(pSheet.Rows.Count, 1).End(xlUp).Row
     vIn = pSheet.Range(pSheet.Cells(1, 1), pSheet.Cells(LRow, 1)).Value
     ReDim vOut(1 To LRow, 0 To pSheet.Columns.Count - 2)
     Set pReg = CreateObject("VBScript.RegExp")
     pReg.Global = True: pReg.IgnoreCase = True
     pReg.Pattern = "<[а-я]+\d+|[а-я]+\d+="".*?"""
      
     For iRow = 1 To LRow
         Set pMatch = pReg.Execute(vIn(iRow, 1))
         If pMatch.Count = 0 Then
             vOut(iRow, 0) = vIn(iRow, 1)
         Else
             sVal = pMatch(0).Value
             If Mid$(sVal, 1, 1) = "<" Then sVal = Mid$(sVal, 2)
             vOut(iRow, 0) = sVal
             For iCol = 1 To pMatch.Count - 1
                 vOut(iRow, iCol) = pMatch(iCol).Value
             Next iCol
         End If
     Next iRow
     pSheet.Range(pSheet.Cells(1, 2), pSheet.Cells(LRow, pSheet.Columns.Count)).Value = vOut
End Sub
[/vba]
Хотя по мне, так лучше разбирать xml используя библиотеку Microsoft XML
 
Ответить
СообщениеГде-то так
[vba]
Код

Public Sub SplitNodeAttributes()
     Dim vOut() As Variant, vIn As Variant
     Dim LRow As Long, pSheet As Worksheet
     Dim pReg As Object, pMatch As Object
     Dim iRow As Long, iCol As Long, sVal As String
      
     Set pSheet = ActiveSheet: LRow = pSheet.Cells(pSheet.Rows.Count, 1).End(xlUp).Row
     vIn = pSheet.Range(pSheet.Cells(1, 1), pSheet.Cells(LRow, 1)).Value
     ReDim vOut(1 To LRow, 0 To pSheet.Columns.Count - 2)
     Set pReg = CreateObject("VBScript.RegExp")
     pReg.Global = True: pReg.IgnoreCase = True
     pReg.Pattern = "<[а-я]+\d+|[а-я]+\d+="".*?"""
      
     For iRow = 1 To LRow
         Set pMatch = pReg.Execute(vIn(iRow, 1))
         If pMatch.Count = 0 Then
             vOut(iRow, 0) = vIn(iRow, 1)
         Else
             sVal = pMatch(0).Value
             If Mid$(sVal, 1, 1) = "<" Then sVal = Mid$(sVal, 2)
             vOut(iRow, 0) = sVal
             For iCol = 1 To pMatch.Count - 1
                 vOut(iRow, iCol) = pMatch(iCol).Value
             Next iCol
         End If
     Next iRow
     pSheet.Range(pSheet.Cells(1, 2), pSheet.Cells(LRow, pSheet.Columns.Count)).Value = vOut
End Sub
[/vba]
Хотя по мне, так лучше разбирать xml используя библиотеку Microsoft XML

Автор - anvg
Дата добавления - 18.09.2013 в 04:12
Неопытный Дата: Среда, 18.09.2013, 09:30 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 23
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Добрый день!
anvg ! Спасибо за помощь!
Почти всё работает, за небольшим исключением, например, если взять такой текст:
<Проверка ПN="1" П11="0.4" П12="0" П13="4.23" />
<Проверка ПN="2" П11="0.7" П12="0.876" П13="0" />
<Проверка ПN="3" П14="Текст3 " />
то почему-то пропускает элемент: Проверка ПN="1"
Хотя в приведенном примере не пропускает, попробую разобраться с кодом.
 
Ответить
СообщениеДобрый день!
anvg ! Спасибо за помощь!
Почти всё работает, за небольшим исключением, например, если взять такой текст:
<Проверка ПN="1" П11="0.4" П12="0" П13="4.23" />
<Проверка ПN="2" П11="0.7" П12="0.876" П13="0" />
<Проверка ПN="3" П14="Текст3 " />
то почему-то пропускает элемент: Проверка ПN="1"
Хотя в приведенном примере не пропускает, попробую разобраться с кодом.

Автор - Неопытный
Дата добавления - 18.09.2013 в 09:30
anvg Дата: Среда, 18.09.2013, 09:55 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Пример содержал лишь кириллицу, поменяйте на
pReg.Pattern = "<[a-zа-я]+\d+|[a-zа-я]+\d+="".*?"""
 
Ответить
СообщениеПример содержал лишь кириллицу, поменяйте на
pReg.Pattern = "<[a-zа-я]+\d+|[a-zа-я]+\d+="".*?"""

Автор - anvg
Дата добавления - 18.09.2013 в 09:55
Неопытный Дата: Среда, 18.09.2013, 10:02 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 23
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Нет, всё равно латиницу не распознает
 
Ответить
СообщениеНет, всё равно латиницу не распознает

Автор - Неопытный
Дата добавления - 18.09.2013 в 10:02
anvg Дата: Среда, 18.09.2013, 10:03 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Разобрался, вот так
pReg.Pattern = "<[a-zа-я]+\d*?|[a-zа-я]+\d*?="".*?"""


Сообщение отредактировал anvg - Среда, 18.09.2013, 10:09
 
Ответить
СообщениеРазобрался, вот так
pReg.Pattern = "<[a-zа-я]+\d*?|[a-zа-я]+\d*?="".*?"""

Автор - anvg
Дата добавления - 18.09.2013 в 10:03
Неопытный Дата: Среда, 18.09.2013, 10:17 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 23
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
Приложил пример.
В четвертой строчке неправильно
К сообщению приложен файл: 9902525.rar (13.5 Kb)


Сообщение отредактировал Неопытный - Среда, 18.09.2013, 18:52
 
Ответить
СообщениеПриложил пример.
В четвертой строчке неправильно

Автор - Неопытный
Дата добавления - 18.09.2013 в 10:17
nerv Дата: Среда, 18.09.2013, 19:37 | Сообщение № 8
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

1. зачем разбирать xml регулярными выражениями, если можно работать с ним, как с объектом?
2. "[^"]+" ваш капитан очевидность


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение1. зачем разбирать xml регулярными выражениями, если можно работать с ним, как с объектом?
2. "[^"]+" ваш капитан очевидность

Автор - nerv
Дата добавления - 18.09.2013 в 19:37
Неопытный Дата: Среда, 18.09.2013, 20:29 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 23
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
зачем разбирать xml регулярными выражениями, если можно работать с ним, как с объектом?
.
Добрый вечер!
Вы имеете в виду Объект RegExp?
Если в xml файле есть несколько разновидностей строк, то надо делать общий (сложный) для всех pattern, или лучше для каждой разновидности свой и потом как-то распознавать где какая разновидность и к ней применять соответствующий.


Сообщение отредактировал Неопытный - Среда, 18.09.2013, 23:32
 
Ответить
Сообщение
зачем разбирать xml регулярными выражениями, если можно работать с ним, как с объектом?
.
Добрый вечер!
Вы имеете в виду Объект RegExp?
Если в xml файле есть несколько разновидностей строк, то надо делать общий (сложный) для всех pattern, или лучше для каждой разновидности свой и потом как-то распознавать где какая разновидность и к ней применять соответствующий.

Автор - Неопытный
Дата добавления - 18.09.2013 в 20:29
anvg Дата: Четверг, 19.09.2013, 02:57 | Сообщение № 10
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Неопытный,
В 4 строке нарушение структуры XML, после < идёт не название узла, а его атрибут (AttributeName="AttributeValue". Добавил учёт и этого, только вот теперь в столбце B будет не имя узла для таких случае, а ИмяАтрибута="ЕгоЗначение" - не запутаетесь?

nerv (Александр)
Кстати, почему на вашей "маске" "[^"]+" не выводится начальный <? Не могу сообразить.
К сообщению приложен файл: 2test.zip (13.7 Kb)
 
Ответить
СообщениеНеопытный,
В 4 строке нарушение структуры XML, после < идёт не название узла, а его атрибут (AttributeName="AttributeValue". Добавил учёт и этого, только вот теперь в столбце B будет не имя узла для таких случае, а ИмяАтрибута="ЕгоЗначение" - не запутаетесь?

nerv (Александр)
Кстати, почему на вашей "маске" "[^"]+" не выводится начальный <? Не могу сообразить.

Автор - anvg
Дата добавления - 19.09.2013 в 02:57
Неопытный Дата: Четверг, 19.09.2013, 10:02 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 23
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
anvg! Большое спасибо! Освободили от изучения сложного и запутанного синтаксиса паттернов.
Практически всё работает. За незначительным исключением :
<Индекс>655030</Индекс> (не выводится индекс) и еще маленький вопрос:
А в такой строчке:
<Сбор ПN="09" П000000000013=" 00204 "> (где последние две цифры в П000000000013 любые)
сделать так, чтобы в колонку выводилось не П000000000003="00204", а только" 00204 ", и сделать " 00204 " в виде "00204",
лучше сделать в pattern или проще потом обработать в колонке двугими способами?


Сообщение отредактировал Неопытный - Четверг, 19.09.2013, 10:07
 
Ответить
Сообщение anvg! Большое спасибо! Освободили от изучения сложного и запутанного синтаксиса паттернов.
Практически всё работает. За незначительным исключением :
<Индекс>655030</Индекс> (не выводится индекс) и еще маленький вопрос:
А в такой строчке:
<Сбор ПN="09" П000000000013=" 00204 "> (где последние две цифры в П000000000013 любые)
сделать так, чтобы в колонку выводилось не П000000000003="00204", а только" 00204 ", и сделать " 00204 " в виде "00204",
лучше сделать в pattern или проще потом обработать в колонке двугими способами?

Автор - Неопытный
Дата добавления - 19.09.2013 в 10:02
nerv Дата: Пятница, 20.09.2013, 11:00 | Сообщение № 12
Группа: Редакторы
Ранг: Обитатель
Сообщений: 431
Репутация: 193 ±
Замечаний: 0% ±

Цитата (Неопытный, 18.09.2013 в 20:29, в сообщении № 9)
Вы имеете в виду Объект RegExp?

нет
[vba]
Код
Set NewXML = CreateObject("MSXML.DOMDocument")
[/vba]
*насколько помню

почему на вашей "маске" "[^"]+" не выводится начальный <? Не могу сообразить

а почему должно выводится? :) Там же написано:
двойная кавычка -> все, кроме кавычки (1 или более символов) -> двойная кавычка

С названиями атрибутов, вероятно так: \S+="[^"]+"


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba
 
Ответить
Сообщение
Цитата (Неопытный, 18.09.2013 в 20:29, в сообщении № 9)
Вы имеете в виду Объект RegExp?

нет
[vba]
Код
Set NewXML = CreateObject("MSXML.DOMDocument")
[/vba]
*насколько помню

почему на вашей "маске" "[^"]+" не выводится начальный <? Не могу сообразить

а почему должно выводится? :) Там же написано:
двойная кавычка -> все, кроме кавычки (1 или более символов) -> двойная кавычка

С названиями атрибутов, вероятно так: \S+="[^"]+"

Автор - nerv
Дата добавления - 20.09.2013 в 11:00
  • Страница 1 из 1
  • 1
Поиск:

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