Нужно конкретно распарсить текст ( небольшой )....

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Нужно конкретно распарсить текст ( небольшой )....

Сообщение Jenizix » 22.03.2005 (Вт) 12:09

Ну вобщем чет я вообще запутался с этими строками.... =(((( или просто опыта не хватает....

Например мне сервер прислал вот такую инфу:

Код: Выделить всё
Jenizix : Daroff rebyat->all
Format : Hi!->Jenizix
Hacker : Fuck off->all
Jenizix : mda....->Hacker
Format : Mdaaa... Nu ti i pen'->Hacker


и у меня в проге переменная nick содержит значение Jenizix

мне нужно распарсить этут инфу и вывести в текстбокс, так чтобы:

1. Если в строчке после -> идет all, добавить эту строку в текстбокс без ->...
2. Если в строчке после -> идет значение, которое содержится в переменной name ( например Format : Hi!->Jenizix ), добавить в текстбокс такую строку Format (лично вам) : Hi!
3. Ну а если после -> идет чейто другой ник, то ничего в текстбокс не добавлять....

уже 3-ий час над этой ИМХО детской задачкой бьюсь, но решения не могу найти.... Обыдно... =(((
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 22.03.2005 (Вт) 12:15

Юзай

INSTR
LEFT
RIGHT

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 22.03.2005 (Вт) 12:18

А может еще Split ?
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 22.03.2005 (Вт) 12:23

Split хуже, поскольку само сообщение может содержать ":" или "->", тогда у тебя лишние куски получатся. А так, все просто - вводишь две позиции - одна instr(stroka," : "), другая instrrev(stroka,"->"). Все, что до первой - от кого, все, что от первой+3 до второй - сообщение, все, что от второй +2 до конца - кому.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 22.03.2005 (Вт) 12:23

ну примерно так
Код: Выделить всё
Option Explicit
Dim s_MyNick As String

Sub ParseStr(ByVal str As String)
  Dim s_From As String
  Dim s_To As String
  Dim s_Msg as string

  s_To = Split(str, "->")(1)
 
  If s_To = "all" Then
    s_From = Split(str, " : ")(0)
    s_Msg = Split(Split(str, " : ")(1), "->")(0)

    Text1.Text = Text1.Text & s_From & ": " & s_Msg & vbCrLf
  ElseIf s_To = s_MyNick Then
    s_From = Split(str, " : ")(0)
    s_Msg = Split(Split(str, " : ")(1), "->")(0)

    Text1.Text = Text1.Text & s_From & "(лично вам): " & s_Msg & vbCrLf
  End If
End Sub
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 22.03.2005 (Вт) 12:38

Вот накатал, посмотрите....

Код: Выделить всё
Dim data As String
Dim strs() As String
Dim nick As String

Private Sub Form_Load()
nick = "Jenizix"

data = "Jenizix : Helllo->all" + vbCrLf + "Format : Hi!->Jenizix" + vbCrLf + "Hacker : Fuck off->all" + vbCrLf + "Jenizix : you silly->Hacker" + vbCrLf + "Format : Mdaaa... Nu ti i pen'->Hacker"

strs = Split(data, vbCrLf)

On Error GoTo error:

For i = 0 To 10
a = InStr(1, strs(i), " : ")
b = InStr(1, strs(i), "->")
ln = b - a

If Mid(strs(i), b + 2) = nick Then Text1.Text = Text1.Text & Left(strs(i), a - 1) & " ( лично вам ) : " & Mid(strs(i), a + 3, ln - 3) & vbCrLf

If Mid(strs(i), b + 2) = "all" Then Text1.Text = Text1.Text & Left(strs(i), a - 1) & " : " & Mid(strs(i), a + 3, ln - 3) & vbCrLf

Next
error:
End Sub


а SPLIT я использовал для разбиения текста по строкам, а потом уже со строками работал....

З.Ы. Ща оптимизну т.к. я забыл про instrrev =(((

Да, и как узнать размер strs() ??? а то у меня это криво реализовано....
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 22.03.2005 (Вт) 12:53

вот оптимизнутый ( но проблема с размером массива strs() осталась (UBound не работает) )

Код: Выделить всё
Dim data As String
Dim strs() As String
Dim nick As String

Private Sub Form_Load()
nick = "Jenizix"

data = "Jenizix : Helllo->all" + vbCrLf + "Format : Hi!->Jenizix" + vbCrLf + "Hacker : Fuck off->all" + vbCrLf + "Jenizix : you silly->Hacker" + vbCrLf + "Format : Mdaaa... Nu ti i pen'->Hacker"
strs = Split(data, vbCrLf)
On Error GoTo error:
For i = 0 To 10

pos_from = InStr(strs(i), " : ")
pos_to = InStrRev(strs(i), "->")

ln = pos_to - pos_from

m_text = Mid(strs(i), pos_from + 3, ln - 3)
m_from = Left(strs(i), pos_from)
m_to = Mid(strs(i), pos_to + 2)


If m_to = nick Then Text1.Text = Text1.Text & m_from & " ( лично вам ) : " & m_text & vbCrLf
If m_to = "all" Then Text1.Text = Text1.Text & m_from & " : " & m_text & vbCrLf

Next
error:
End Sub
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 22.03.2005 (Вт) 13:12

Cyrax, как ты код с подсветкой синтаксиса вставляеш???

вот последний вариант...


Код: Выделить всё
Dim data As String
Dim strs() As String
Dim nick As String
Dim n As Integer

Private Sub Form_Load()
nick = "Jenizix"

data = "Jenizix : Helllo->all" + vbCrLf + "Format : Hi!->Jenizix" + vbCrLf + "Hacker : Fuck off->all" + vbCrLf + "Jenizix : you silly->Hacker" + vbCrLf + "Format : Mdaaa... Nu ti i pen'->Hacker"

strs = Split(data, vbCrLf)

On Error GoTo endArray: ' вот так я органиховал вычисление размера массива srts()...
For n = 0 To 2000 ' надеюсь больше 2000 строк приходить не будет...
d = Len(strs(n))
Next
endArray:

For i = 0 To n - 1

pos_from = InStr(strs(i), " : ")
pos_to = InStrRev(strs(i), "->")

ln = pos_to - pos_from

m_text = Mid(strs(i), pos_from + 3, ln - 3)
m_from = Left(strs(i), pos_from - 1)
m_to = Mid(strs(i), pos_to + 2)

If m_from = nick And m_to <> "all" Then Text1.Text = Text1.Text & m_from & " ( лично " & m_to & " ) : " & m_text & vbCrLf ' свои то сообщения я тоже должен видеть =)))
If m_to = nick Then Text1.Text = Text1.Text & m_from & " ( лично вам ) : " & m_text & vbCrLf
If m_to = "all" Then Text1.Text = Text1.Text & m_from & " : " & m_text & vbCrLf

Next

End Sub

Последний раз редактировалось Jenizix 23.03.2005 (Ср) 14:09, всего редактировалось 1 раз.
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 22.03.2005 (Вт) 13:30

Почему UBound-то не работает? У меня все в порядке, UBound(strs) в твоем примере выдает 4.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 22.03.2005 (Вт) 16:26

Ну и опять оффтоповое добавление :)
Учите регулярные выражения, или, даже, устройство конечных автоматов, чтобы писать правильные парсеры.
Кому учебник? :)

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 22.03.2005 (Вт) 16:44

uhm, сенкс! а я пробовал strs.UBound.... стыдно...

Кому учебник?

Мне! =) jenizix@mail.ru

а как Cyrax вставлял код с подсветкой синтаксиса?
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.03.2005 (Вт) 16:52

А он раздел "VBStreets" читает иногда...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 22.03.2005 (Вт) 17:00

...и на встроенном в форум языке microPHP пишет парсер для подсветки синтаксиса каждый раз

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 23.03.2005 (Ср) 14:00

2 GSerg & xolod: шутники :)
2 Jenizix: use
Код: Выделить всё
[syntax="vb"]VB-Code[syntax]
в быстром ответе этого нет, но в редакторе сообщения есть доп. кнопки
2 xolod again: регулярные выражения, конечно, тоже можно... но как мне кажеться, для такой простой задачи вполне хватит и стандартных средств языка...
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 160

    TopList