Как пройти поле Body построчно

Oksana

Lotus team
10.01.2006
329
0
#1
Подскажите, пожалуйста, как пройти поле письма Body строчка за строчкой, чтобы разложить значения из строк в нужные поля.
 

Oksana

Lotus team
10.01.2006
329
0
#3
Использовать класс NotesRichTextNavigator.
да вот не получается :(
точнее ерунда получается
мне перед разбором надо разбить этот текст на строки, фактически просто заменяю "," на знак перевода строки
вот потом NotesRichTextNavigator, видимо принимает все за один абзац

я сделала вариант загоняла всё в текстовый файл и потом считывала назад построчно, так получилось
но хотелось бы без него
не могу с NotesRichTextNavigator разобраться
 

nvyush

Lotus team
22.04.2009
2 317
0
#4
Может тогда проще будет воспользоваться
plainText$ = notesRichTextItem.GetUnformattedText( )
и разбирать строку?
 

Oksana

Lotus team
10.01.2006
329
0
#6
Может тогда проще будет воспользоваться
plainText$ = notesRichTextItem.GetUnformattedText( )
и разбирать строку?
был перерыв в программировании, сейчас торможу жутко :(
Вот смотрите кусок тела письма, которое приходит:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"пример письма"</div></div><div class="sp-body"><div class="sp-content">Event Time: 2011-03-04 10:42:00
Event Type: Environmental
Object of Reference: SubNetwork=ONRM_RootMo,SubNetwork=AXE,ManagedElement=BSC2,BssFunction=BSS_Manage
dFunction,BtsSiteMgr=POLUS2_ERUDA
Object Class: 8
Backup Object:
Backup Status:
Trend Indication:
Perceived Severity: Critical
Probable Cause: Different causes possible for same message
Specific Problem: RADIO X-CEIVER ADMINISTRATION BTS EXTERNAL FAULT




Так ка часть переменных нужных мне, находятся в одной строке. посчитала наиболее удобным разложить их построчно, вот поэтому и заменяю "," на Chr(13)

может нагородила, но делаю это так:
<!--shcode--><pre><code class='разбиение на абзацы'>Set rtitem = CurDoc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
plainText = rtitem.GetFormattedText( True, 150 )
End If


Set MailBody = New NotesRichTextItem( CurDoc, "Body" )
Call MailBody.AppendText(Replace(plainText,",",Chr(13)) )
Call CurDoc.Save(True, False)[/CODE]


После чего получаю Body в новом варианте, из которого и хотелось бы извлечь построчно значение требуемых переменных (выделила жирным).
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Body построчно"</div></div><div class="sp-body"><div class="sp-content">Event Time: 2011-03-04 10:44:00
Event Type: Environmental
Object of Reference: SubNetwork=ONRM_RootMo
SubNetwork=AXE
ManagedElement=BSC2
BssFunction=BSS_ManagedFunction
BtsSiteMgr=POLUS2_ERUDA
Object Class: 8
Backup Object:
Backup Status:
Trend Indication:
Perceived Severity: Cleared
Probable Cause: Different causes possible for same message
Specific Problem: RADIO X-CEIVER ADMINISTRATION BTS EXTERNAL FAULT
 

Xalet

Well-known member
08.08.2008
410
0
#7
А если так?

Код:
	Set rtitem = CurDoc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
plainText = rtitem.GetFormattedText( True, 150 )
End If

lines = Fulltrim(Split(plainText, ","))
Set MailBody = New NotesRichTextItem( CurDoc, "Body" )

Forall l In lines
Call MailBody.AppendText(l)
Call MailBody.AddNewLine(1)
End Forall

Call CurDoc.Save(True, False)
З.Ы. Новая строка, кстати, не всегда символ 13. Иногда оно еще работает только вместе с 9(перевод каретки или как оно там).
 

nvyush

Lotus team
22.04.2009
2 317
0
#8
З.Ы. Новая строка, кстати, не всегда символ 13. Иногда оно еще работает только вместе с 9(перевод каретки или как оно там).
Насколько я помню, 13 — возврат каретки (CR), 10 — перевод строки (LF), 9 — табуляция (TAB). В Windows строки завершаются парой символов CRLF, в никсах, кмк, LF, но могу ошибаться.

Oksana
А зачем нужно Body в новом варианте, может сразу со строкой работать, например, так:
Код:
		Set rtitem = CurDoc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
plainText = rtitem.GetUnFormattedText()
End If
Dim findArr(1) As String
Dim replArr(1) As String
Dim resArr As Variant

findArr(0) = ","
findArr(1) = Chr(13)
replArr(0) = Chr(10)
replArr(1) = ""
resArr = Split(Replace(plainText, findArr, replArr), Chr(10))
 

Oksana

Lotus team
10.01.2006
329
0
#10
А если так?

<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код"</div></div><div class="sp-body"><div class="sp-content">
Код:
	Set rtitem = CurDoc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
plainText = rtitem.GetFormattedText( True, 150 )
End If

lines = Fulltrim(Split(plainText, ","))
Set MailBody = New NotesRichTextItem( CurDoc, "Body" )

Forall l In lines
Call MailBody.AppendText(l)
Call MailBody.AddNewLine(1)
End Forall

Call CurDoc.Save(True, False)
З.Ы. Новая строка, кстати, не всегда символ 13. Иногда оно еще работает только вместе с 9(перевод каретки или как оно там).
Визуально получилось как и у меня, то есть видим Body построчно, а при фактическом переборе строк, та длинная так и остается склееной

Добавлено:
Насколько я помню, 13 — возврат каретки (CR), 10 — перевод строки (LF), 9 — табуляция (TAB). В Windows строки завершаются парой символов CRLF, в никсах, кмк, LF, но могу ошибаться.

Oksana
А зачем нужно Body в новом варианте, может сразу со строкой работать, например, так:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"код"</div></div><div class="sp-body"><div class="sp-content">
Код:
		Set rtitem = CurDoc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
plainText = rtitem.GetUnFormattedText()
End If
Dim findArr(1) As String
Dim replArr(1) As String
Dim resArr As Variant

findArr(0) = ","
findArr(1) = Chr(13)
replArr(0) = Chr(10)
replArr(1) = ""
resArr = Split(Replace(plainText, findArr, replArr), Chr(10))
да, так кажется всё получилось, работает )
вот осмыслить пока не получилось )))
сейчас еще погоняю, проверю
 

nvyush

Lotus team
22.04.2009
2 317
0
#11
вот осмыслить пока не получилось )))
Ничего сложного, реплэйсом меняем запятые на переводы строк и убираем возвраты каретки, чтоб не мешались, затем сплитом "режем" строку на подстроки по переводам строк.

В принципе, можно тем же реплэйсом менять "=" на ":" для упрощения последующего анализа (добавить в findArr(2) = "=", replArr(2) = ":")
 

Oksana

Lotus team
10.01.2006
329
0
#12
Ничего сложного, реплэйсом меняем запятые на переводы строк и убираем возвраты каретки, чтоб не мешались, затем сплитом "режем" строку на подстроки по переводам строк.

В принципе, можно тем же реплэйсом менять "=" на ":" для упрощения последующего анализа (добавить в findArr(2) = "=", replArr(2) = ":")
Спасибо!

а подскажите еще, как мне правильно вставить в поле с типом дата/время
эту строчку, что бы по ней потом была возможна сортировка по времени
Event Time: 2011-03-04 10:42:00
 

nvyush

Lotus team
22.04.2009
2 317
0
#13
В простейшем случае doc.ReplaceItemValue("ItemName", CDat(DataAsString))
Если не прокатит, через класс NotesDateTime.