Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / VBA - Парсинг строк / 18 сообщений из 18, страница 1 из 1
19.03.2007, 14:52:23
    #34400415
Zalagaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
Господа, вот пример строки:

str="Geologist - Development/Analysis / Геолог – Разработка месторождения /Анализ разработки"

Как разделить ее на 2 части? Английскую и русскую?

Какие мысли будут?

Спасибо.
...
Рейтинг: 0 / 0
19.03.2007, 15:11:41
    #34400496
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub f()
Const vbCyr As String = "абвгдеёжзиклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
Dim str$, p!
str = "Geologist - Development/Analysis / Геолог – Разработка месторождения /Анализ разработки"
For i =  1  To Len(str)
    p = InStr(vbCyr, Mid(str, i,  1 ))
    If p >  0  Then
        Debug.Print Mid(str,  1 , p -  1 )
        Debug.Print Mid(str, p)
        Exit For
    End If
Next
End Sub
наверняка есть способы получше
...
Рейтинг: 0 / 0
19.03.2007, 15:31:08
    #34400576
Zalagaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
я вот так сделал

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
For i =  1  To Len(str)
    C = Mid(str, i,  1 ) ' берем букву
    
    Select Case C
    
    Case "a" To "z", "A" To "Z"
        SEng = SEng & Connect & C
        Connect = ""
    Case "а" To "я", "А" To "Я"
        SRus = SRus & Connect & C
        Connect = ""
     Case Else
        Connect = Connect & C
        
    End Select
Next
...
Рейтинг: 0 / 0
19.03.2007, 15:34:15
    #34400586
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
2Zalagaev с учетом написанного vkodor , как точно нужно разделить:(1) какие символы могут|должны попадать, (2) всегда ли строка из 4 частей?
...
Рейтинг: 0 / 0
19.03.2007, 16:32:43
    #34400771
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub SplitToParts()
  Dim RegExp As Object
  Dim strTxt As String
  Set RegExp = CreateObject("vbscript.regexp")
  strTxt = "Geologist - Development/Analysis /Геолог – Разработка месторождения /Анализ разработки"
  With RegExp
    .Pattern = ".*[a-z]\s{0,}/\s{0,}[А-Яа-я]"
    .Global = True
    Debug.Print Mid(.Execute(strTxt)( 0 ),  1 , .Execute(strTxt)( 0 ).Length -  1 )
    Debug.Print Mid(strTxt, .Execute(strTxt)( 0 ).Length)
  End With
End Sub
...
Рейтинг: 0 / 0
19.03.2007, 17:18:30
    #34400918
Zalagaev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
количество частей строки не известно. всегдя меняется. как человеку в голову взбредет. Иногда пишут и / и \ | ~ -- А если будут немецкие буквы, то что делать - не знаю..
...
Рейтинг: 0 / 0
19.03.2007, 17:21:16
    #34400927
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
Zalagaevколичество частей строки не известно. всегдя меняется. как человеку в голову взбредет. Иногда пишут и / и \ | ~ -- А если будут немецкие буквы, то что делать - не знаю..тогда, конечно, лучше всего использовать и развивать предложение lena_####
...
Рейтинг: 0 / 0
19.03.2007, 17:37:47
    #34400967
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
lena_#### Расшифруй, пожалуйста. Что значит "{0,}" ?
...
Рейтинг: 0 / 0
19.03.2007, 18:11:17
    #34401054
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
vkodor

{n,} – ищет не менее n раз повторенный предыдущий знак

{n,} - n is a nonnegative integer. Matches at least n times. For example, "o{2,}" does not match the "o" in "Bob" and matches all the o's in "foooood".
"o{1,}" is equivalent to "o+"
"o{0,}" is equivalent to "o*".
В моем случае ищется пробел (\s), который может быть перед слешем (/) а может и не быть. Т.е. и для строки "Analysis/Геолог" и для "Analysis /Геолог" и для "Analysis    /Геолог" поиск окажется успешным.
Учитывая приведенную мною цитату из help’а, в моем примере можно образец поиска записать в виде:
Код: plaintext
".*[a-z]\s*/\s*[А-Яа-я]"

Если я чего-то недопонимаю - поправьте меня :)
...
Рейтинг: 0 / 0
19.03.2007, 20:18:07
    #34401333
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
Zalagaev

Вот вариант без использования функции Mid. Работает с разделителями англицкой и русской части: / \ | ~ -- (по крайней мере, с закомментированными в примере строками работает)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub SplitToParts_1()
  Dim RegExp As Object
  Dim strTxt As String
  Set RegExp = CreateObject("vbscript.regexp")
'  strTxt = "Geologist - Development/Analysis |Геолог – Разработка месторождения /Анализ разработки"
'  strTxt = "Geologist - Development/Analysis ~Геолог – Разработка месторождения /Анализ разработки"
'  strTxt = "Geologist - Development/Analysis--Геолог – Разработка месторождения /Анализ разработки"
'  strTxt = "Geologist - Development/Analysis\  Геолог – Разработка месторождения /Анализ разработки"
  strTxt = "Geologist - Development/Analysis / Геолог – Разработка месторождения /Анализ разработки"
  With RegExp
    .Pattern = "(.*[a-z])(\s*)([/\\|~]|(--))(\s*)([А-Яа-я].*)"
    .Global = True
    Debug.Print .Execute(strTxt)( 0 ).SubMatches( 0 )
    Debug.Print .Execute(strTxt)( 0 ).SubMatches( 5 )
  End With
End Sub
...
Рейтинг: 0 / 0
19.03.2007, 22:00:31
    #34401445
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
lena_####Вот вариант без использования функции Mid. Работает с разделителями англицкой и русской части: / \ | ~ -- (по крайней мере, с закомментированными в примере строками работает)Во первых, слишком сложно. Во вторых, неверно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Sub SplitToParts_1()
    Dim re As RegExp, m As MatchCollection, SM As SubMatches
    Dim c As Range
    Set re = New RegExp
    
    re.Pattern = "(.+?)\s*(\||~|\\|\s/|--)\s*(.+)"
    re.Global = True
    For Each c In Selection
        Set m = re.Execute(c.Text)
        If m.Count =  0  Then
            Debug.Print "not recognized"
        Else
            Set SM = m( 0 ).SubMatches
            c.Offset( 0 ,  1 ).Value = SM( 0 )
            c.Offset( 0 ,  2 ).Value = SM( 2 )
        End If
    Next
End Sub
...
Рейтинг: 0 / 0
19.03.2007, 23:17:46
    #34401517
lena_####
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
White Owl

Спасибо Вам за непрозвучавшую конструктивную критику. Свои ошибки, в том числе и критические, я увидела. Еще раз спасибо. Но вы уж слишком категоричны. У Вас, к слову сказать, тоже неверно. Прошено было распасить английскую и русскую части. Гляньте как парсится Вашим кодом строка:
Код: plaintext
Geologist - Development /Analysis |Геолог – Разработка месторождения /Анализ разработки
...
Рейтинг: 0 / 0
20.03.2007, 00:43:12
    #34401552
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
lena_#### White Owl

Спасибо Вам за непрозвучавшую конструктивную критику. Свои ошибки, в том числе и критические, я увидела. Еще раз спасибо. Но вы уж слишком категоричны. У Вас, к слову сказать, тоже неверно. Прошено было распасить английскую и русскую части. Гляньте как парсится Вашим кодом строка:
Код: plaintext
Geologist - Development /Analysis |Геолог – Разработка месторождения /Анализ разработки
Английскую и русскую? ээээ.... а вот начало топика я прочитать забыл :)
Ну тогда задача в общем случае через регулярные выражения не решается.
Чтобы уверенно отличить начало русской части - надо найти в строке первый символ принадлежащий к кириллице, потом откатится чуть назад на случай что первое слово там начинатся цифр (например это маркировка транзистора). Поставить маркер начала русской части, потом откатится еще назад пропустить все знаки препинания которые могут быть использованы как разделитель.

Через регулярные выражения это все конечно тоже можно сделать, но проблема в том, что регэкспы в Windows Scripting Host не умеет работать с восьмибитными символами в паттернах.

Так что либо в цикле перебирать все буквы по алгоритму который я только что описал, либо приказать всем юзерам набирающим эту фигню ставить какой-нибудь общий для всех разделитель. Либо не маятся дурью и делать перевод сразу в две разные ячейки.
...
Рейтинг: 0 / 0
20.03.2007, 10:21:59
    #34401951
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
lena_#### vkodor

{n,} – ищет не менее n раз повторенный предыдущий знак

{n,} - n is a nonnegative integer. Matches at least n times. For example, "o{2,}" does not match the "o" in "Bob" and matches all the o's in "foooood".
"o{1,}" is equivalent to "o+"
"o{0,}" is equivalent to "o*".
В моем случае ищется пробел (\s), который может быть перед слешем (/) а может и не быть. Т.е. и для строки "Analysis/Геолог" и для "Analysis /Геолог" и для "Analysis    /Геолог" поиск окажется успешным.
Учитывая приведенную мною цитату из help’а, в моем примере можно образец поиска записать в виде:
Код: plaintext
".*[a-z]\s*/\s*[А-Яа-я]"

Если я чего-то недопонимаю - поправьте меня :)
Спасибо понятно
...
Рейтинг: 0 / 0
20.03.2007, 17:30:16
    #34403705
Программист Дёня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
vkodor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub f()
Const vbCyr As String = "абвгдеёжзиклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
Dim str$, p!
str = "Geologist - Development/Analysis / Геолог – Разработка месторождения /Анализ разработки"
For i =  1  To Len(str)
    p = InStr(vbCyr, Mid(str, i,  1 ))
    If p >  0  Then
        Debug.Print Mid(str,  1 , p -  1 )
        Debug.Print Mid(str, p)
        Exit For
    End If
Next
End Sub
наверняка есть способы получше


ооуу, мне уже подражают, спасибо-спасибо!
...
Рейтинг: 0 / 0
20.03.2007, 17:37:06
    #34403730
Программист Дёня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
White Owl lena_#### White Owl

Спасибо Вам за непрозвучавшую конструктивную критику. Свои ошибки, в том числе и критические, я увидела. Еще раз спасибо. Но вы уж слишком категоричны. У Вас, к слову сказать, тоже неверно. Прошено было распасить английскую и русскую части. Гляньте как парсится Вашим кодом строка:
Код: plaintext
Geologist - Development /Analysis |Геолог – Разработка месторождения /Анализ разработки
Английскую и русскую? ээээ.... а вот начало топика я прочитать забыл :)
Ну тогда задача в общем случае через регулярные выражения не решается.
Чтобы уверенно отличить начало русской части - надо найти в строке первый символ принадлежащий к кириллице, потом откатится чуть назад на случай что первое слово там начинатся цифр (например это маркировка транзистора). Поставить маркер начала русской части, потом откатится еще назад пропустить все знаки препинания которые могут быть использованы как разделитель.

Через регулярные выражения это все конечно тоже можно сделать, но проблема в том, что регэкспы в Windows Scripting Host не умеет работать с восьмибитными символами в паттернах.

Так что либо в цикле перебирать все буквы по алгоритму который я только что описал, либо приказать всем юзерам набирающим эту фигню ставить какой-нибудь общий для всех разделитель. Либо не маятся дурью и делать перевод сразу в две разные ячейки.


можно мысль, по-моему vkodor используя мою идею предложил верную мысль, но не до конца, видать так же не дочитал топик, вроде – да, нужно каждую букву перебрать, выяснить её пренадлежность к кириллице и с неё вырезать части, и вся маятня
...
Рейтинг: 0 / 0
20.03.2007, 18:00:26
    #34403822
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
Программист Дёня vkodor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub f()
Const vbCyr As String = "абвгдеёжзиклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
Dim str$, p!
str = "Geologist - Development/Analysis / Геолог – Разработка месторождения /Анализ разработки"
For i =  1  To Len(str)
    p = InStr(vbCyr, Mid(str, i,  1 ))
    If p >  0  Then
        Debug.Print Mid(str,  1 , p -  1 )
        Debug.Print Mid(str, p)
        Exit For
    End If
Next
End Sub
наверняка есть способы получше


ооуу, мне уже подражают, спасибо-спасибо!
Не обольщайся.
Почитай.
String в Double
этот способ известен давно, я лишь с твоего топика скопировал данные, дабы самому не писать
...
Рейтинг: 0 / 0
20.03.2007, 18:07:03
    #34403853
Программист Дёня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA - Парсинг строк
vkodor Программист Дёня vkodor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub f()
Const vbCyr As String = "абвгдеёжзиклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
Dim str$, p!
str = "Geologist - Development/Analysis / Геолог – Разработка месторождения /Анализ разработки"
For i =  1  To Len(str)
    p = InStr(vbCyr, Mid(str, i,  1 ))
    If p >  0  Then
        Debug.Print Mid(str,  1 , p -  1 )
        Debug.Print Mid(str, p)
        Exit For
    End If
Next
End Sub
наверняка есть способы получше


ооуу, мне уже подражают, спасибо-спасибо!
Не обольщайся.
Почитай.
String в Double
этот способ известен давно, я лишь с твоего топика скопировал данные, дабы самому не писать


ладно ладно, если Лев сердиться, значит он неправ
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / VBA - Парсинг строк / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]