Как обработать текст построчно?

Тема в разделе "Lotus - Программирование", создана пользователем vvlad, 1 фев 2007.

  1. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    Hi ALL!!!
    Подскажите плиз, как можно провернуть следующее:

    Есть текстовое поле. Его содержимое выглядит приблизительно так:

    Код (Text):
    ...
    31.01.2007 16:54:38  Opened session for user1/server1 (Release 6.5.5)
    31.01.2007 16:54:38  Closed session for user1/server1
    Databases accessed:  1  Documents read:  0  Documents written:   0
    31.01.2007 16:54:41  Opened session for user2/server2 (Release 5.0.11)
    31.01.2007 16:54:41  Closed session for user1/server1
    ...
    Я хочу из этого поля извлечь информацию о времени доступа к серверу, имени пользователя
    и версии ПО, т.е. обработать каждую строку по такому правилу:
    Код (Text):
    Если в строке есть "(Release*)",
    то а1=время, а2=имя пользователя, а3=версия
    иначе обработать следующую строку
    возможно ли это сделать на LS или все-таки прийдется использовать Perl ?
    Если да, подскажите как лучше.
    Спасибо!
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    какие вопросы, вот тема про перенс каретки, но тут собственно тоже самое


    а вообще поле содержит в себе массив строк, проходитесь по этому массиву, такм где находите слово Release там и начинаете обрабатывать
     
  3. Duedev

    Duedev Гость

    Код (Text):
    Sub My()
    Const SubName$="Локальный скрипт"
    Dim doc As NotesDocument
    Dim item As NotesItem
    Dim i As Integer
    Dim tmp As Variant
    On Error Goto errhndle

    Set item=doc.GetFirstItem("Имя текстового поля")
    i=0
    While   Not(item.Values(i) Is Nothing)
    tmp=Instr(Cstr(Item.Values(i)),"(Release)")
    If Not(Tmp=Null) And (Cint(tmp)>0) Then
    'Выборка времени и даты
    End If
    i=i+1  
    Wend
    ex:
    Exit Sub   
    errhndle:
    Messagebox SubName$+Chr(10)+"Ошибка: "+Error+Chr(10)+"Номер: "+Cstr(Err)+Chr(10)+"В строке: "+Cstr(Erl),64,"Внимание"
    Goto ex
    End Sub
     
  4. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    В моем случае массив item.Values содержит единственный элемент:

    item.Values(0)=
    ...
    31.01.2007 16:54:38 Opened session for user1/server1 (Release 6.5.5)
    31.01.2007 16:54:38 Closed session for user1/server1
    Databases accessed: 1 Documents read: 0 Documents written: 0
    31.01.2007 16:54:41 Opened session for user2/server2 (Release 5.0.11)
    31.01.2007 16:54:41 Closed session for user1/server1
    ...

    Как его разбить на строки, что бы потом построчно обработать?

    Копаю в направлении определения номера позиции символа перевода каретки в тексте,
    что бы потом использовать Right или Left
     
  5. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Копай в сторону StrToken. Или на массив строк разбей - Split.
     
  6. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    <!--QuoteBegin-Medevic+2:02:2007, 10:15 -->
    <span class="vbquote">(Medevic @ 2:02:2007, 10:15 )</span><!--QuoteEBegin-->Копай в сторону StrToken. Или на массив строк разбей - Split.
    [snapback]54774" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Спасибо!
    Блин, сейчас пытаюсь это реализовать в R5, но видимо не судьба. Ни SPLIT, ни StrToken там нет.
    Буду писать в R6.
     
  7. oshmianski

    oshmianski Гость

    Для: vvlad

    Код (Text):
    Function StripString(source As String, string1 As String) As Variant
    'разбирает source на слова между string1

    'пример:
    'Dim masVal As Variant
    'masVal = StripString("Sergey Ivanovich Vintselovich", " ")
    'masVal(0) = Sergey
    'masVal(1) = Ivanovich
    'masVal(2) = Vintselovich

    Dim mas() As String
    Dim i
    Dim lenSeparator As Integer
    lenSeparator = Len(string1)
    i = 0
    While Instr(source, string1)
    Redim Preserve mas(i)
    mas(i) = Left(source, Instr(source, string1) - 1)
    source = Mid(source, Instr(source, string1) + lenSeparator)
    i = i + 1
    Wend
    Redim Preserve mas(i)
    mas(i) = source
    StripString = mas
    End Function
    пример. по идее должен работать и в 5-ке
    Код (Text):
    Dim TextList As Variant
    TextList = StripString(rtText, Chr(13) & Chr(10))
    если не получиться, то прочто в цекле пройди по тексту в стороке и посмотри какой разделитель у тебя используется
     
  8. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    Сделал так:
    Формирование массива строк:
    Код (Text):
            ret=Split(item.Values(0),Chr(13)&Chr(10))
    Вывод имени пользователя + версии клиента:

    Код (Text):
            Forall ii In ret
    s$=ii
    If s$ Like "*Release*" Then
    U$=Strtoken(s$, " ",8)+" "+Strtoken(s$, " ",9)+" "+Strtoken(s$, " ",10)
    R$=Left(Strtoken(s$, "(",2), Len(Strtoken(s$, "(",2))-1)
    Print U$+" - "+R$
    End If
    Работает, но не красиво то что есть жесткая привязка к позиции слов.
    Т.е. Если имя пользователя в формате "Ivan I Ivanov/server" то получим что нужно,
    а если будет "Ivanov/server" - то будет смещение...
     
  9. RAJ

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    Для работы со списками я обычно использую @Explode.

    В LS это будет выглядеть так:


    Dim TextList As Variant
    TextList = Evaluate("@Explode(SolidText;@NewLine)", doc)

    где
    doc - исходный документ с текстовым полем;
    SolidText - содержит текст, разделенный переводом строк
    TextList - массив строк


    ну а дальше, распарсить строки дело техники
     
Загрузка...

Поделиться этой страницей