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

vvlad

Well-known member
19.01.2007
63
0
#1
Hi ALL!!!
Подскажите плиз, как можно провернуть следующее:

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

Код:
...
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
...
Я хочу из этого поля извлечь информацию о времени доступа к серверу, имени пользователя
и версии ПО, т.е. обработать каждую строку по такому правилу:
Код:
Если в строке есть "(Release*)", 
то а1=время, а2=имя пользователя, а3=версия
иначе обработать следующую строку
возможно ли это сделать на LS или все-таки прийдется использовать Perl ?
Если да, подскажите как лучше.
Спасибо!
 

morpheus

скриптописец
07.08.2006
3 915
1
#2
какие вопросы, вот тема про перенс каретки, но тут собственно тоже самое


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

Duedev

#3
Код:
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
 

vvlad

Well-known member
19.01.2007
63
0
#4
В моем случае массив 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
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#5
Копай в сторону StrToken. Или на массив строк разбей - Split.
 

vvlad

Well-known member
19.01.2007
63
0
#6
<!--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.
 
O

oshmianski

#7
Для: vvlad

Код:
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-ке
Код:
Dim TextList As Variant
TextList = StripString(rtText, Chr(13) & Chr(10))
если не получиться, то прочто в цекле пройди по тексту в стороке и посмотри какой разделитель у тебя используется
 

vvlad

Well-known member
19.01.2007
63
0
#8
Сделал так:
Формирование массива строк:
Код:
		ret=Split(item.Values(0),Chr(13)&Chr(10))
Вывод имени пользователя + версии клиента:

Код:
		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" - то будет смещение...
 

RAJ

Well-known member
17.01.2007
440
0
#9
Для работы со списками я обычно использую @Explode.

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


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

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


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