Как делается такое (работа с текстом)?

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

Как делается такое (работа с текстом)?

Сообщение Gmp » 25.07.2006 (Вт) 13:07

Имеем текст:
АААА1
АААА2
ББББ1
ББББ2
ББББ2
ВВВВ3
ВВВВ4
ВВВВ6
ВВВВ5
ВВВВ1
AAAA3
AAAA1
и т.д.

как мне сгруппировать их в строки
АААА1 АААА2
ББББ1 ББББ2 ББББ2
ВВВВ3 ВВВВ4 ВВВВ6 ВВВВ5 ВВВВ1
AAAA3 AAAA1

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

Сообщение GSerg » 25.07.2006 (Вт) 13:20

Gmp писал(а):Как делается такое

Определяются правила группировки (на бумажке, в терминах, без бытовухи).
Только потом пишется код.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 25.07.2006 (Вт) 14:13

пока меня не отключили на пару недель, хочу помочь:
есть несколько вариантов применимых к данному примеру:

1 вариант.
1. загоняешь всё в массив (допустим a() )
2. делаешь выборку по 4 символам
3. пишешь в разные переменные, типа:
if left$(a(x),4)="AAAA" then a=a+a(x) & " "
if left$(a(x),4)="BBBB" then b=b+a(x) & " "
и т.д.


2 вариант
1. загоняешь всё в массив (допустим a() )
2. Сортируешь массив
3. Делаешь выборку опять же по 4 символам

2 вариант лучше, т.к. неограничен в количестве выбоных символов т.е.не надо заводить кучу переменных[/b]

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 25.07.2006 (Вт) 14:33

2 XPAHuTEJIb, если внимательно посмотреть вопрос автора, то можно даже без телепатических способностей предположить что он имеет ввиду несколько отличное, от того, что ты ему предлагаешь.

2 GMP, настоятельно рекомендуется воспользоваться советом GSerg и, во-первых, понять самому, а во-вторых, пояснить всем нам, что же таки необходимо сделать с исходным текстом.
Весь мир матрица, а мы в нем потоки байтов!

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 25.07.2006 (Вт) 14:53

если основываться на приведенном примере, то 1 вариант XPAHuTEJIb подходит, только надо не выборку делать, а писать новую строку при изменении первого символа. И результат лучше класть тоже в массив, чтобы не было проблем с переменными
примерно так

1) бежим по тексту Do While
2) берм строку Get #1,, strTmp
3) смотрим 1 символ If Left(strTmp,1) <> tmpChar
4) Redim Preserve a(ubound(a)+1)
5) a(Ubound(a)) = strTmp
6) tmpChar = LEFT(strTmp)
7) Else a(Ubound(a)) = a(Ubound(a)) + strTmp

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 25.07.2006 (Вт) 19:18

Всем ответившим спасибо, пока не получилось. :)
!Viper!
Вроде понятно написал что надо.
Работать должно как я предполагаю так
считываем строку Left$(strStroka, 4), сравниваем со следующей Left$(strStroka, 4) строкой, если одинаково ставим 1 & " " & 2 строка если еще и следующая Left$(strStroka, 4) равна 1 Left$(strStroka, 4) строке делаем 1 & " " & 2 & " " & 3 и т.д. если 1 строка <> следующей - тогда 1 & " " & 2 & " " & 3 & vbCrLf и сравниваем уже с этой новой строки как в начале. Надеюсь понятно объяснил :)

Если кто хочет потренироваться сделайте код примерный для этого:

Dim strQ as string
Dim strA() as string

strQ = "AAAA AAAA AAAA BBBB BBBB BBBB BBBB AAAA AAAA CCCC CCCC DDDD DDDD"
strA = Split(strQ, " ")

Пусть на выходе получим строку
"AAAA AAAA AAAA | BBBB BBBB BBBB BBBB | AAAA AAAA | CCCC CCCC | DDDD DDDD"

Условие задачи что количество АААА BBBB CCCC DDDD может менятся, также как и их положение в строке. ;)

НУ что есть желающие пораскинуть мозгами? :mrgreen:

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 25.07.2006 (Вт) 20:07

Блин. Да что тут думать-то?
Код: Выделить всё

Dim strQ As String, strOut As String
Dim strA() As String
Dim i As Integer

strQ = "AAAA AAAA AAAA BBBB BBBB BBBB BBBB AAAA AAAA CCCC CCCC DDDD DDDD"
strA = Split(strQ, " ")
strOut = strA(0)
For i = 1 To UBound(strA)
    If (strA(i) = Right$(strOut, Len(strA(i)))) Then
        strOut = strOut & " " & strA(i)
    Else
        strOut = strOut & vbCrLf & strA(i)
    End If
Next i

strOut - выходная строка
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 25.07.2006 (Вт) 20:10

не совсем понял что д.б. на выходе :)
если делить по пробелам - то последний символ тоже д.б. пробел?
strQ = "AAAA AAAA AAAA BBBB BBBB BBBB BBBB AAAA AAAA CCCC CCCC DDDD DDDD "



в общем, если я правильно понял - код:
Код: Выделить всё
Private Sub Form_Load()
Dim strQ As String
Dim strA() As String

Dim x, q

strQ = "AAAA AAAA AAAA BBBB BBBB BBBB SSSS BBBB AAAA AAAA CCCC CCCC DDDD DDDD EEEE DDDD AAAA SSSS "
strA = Split(strQ, " ")

x = 1
Do Until x = UBound(strA)
For q = UBound(strA) To x Step -1
  If strA(q) < strA(q - 1) Then swap strA(q), strA(q - 1)
Next q
x = x + 1
Loop

For q = 1 To UBound(strA) - 1
If q = UBound(strA) - 1 Then
  If Left$(strA(q), 4) = Left$(strA(q + 1), 4) Then
   Text1.Text = Text1.Text & strA(q) & " " & strA(q + 1)
   Exit For
  Else
   Text1.Text = Text1.Text & strA(q) & vbCrLf & strA(q + 1)
   Exit For
  End If
End If
If Left$(strA(q), 4) = Left$(strA(q + 1), 4) Then Text1.Text = Text1.Text & strA(q) & " " Else Text1.Text = Text1.Text & strA(q) & vbCrLf
Next q
End Sub

Sub swap(a As String, b As String)
Dim ab(2)
ab(1) = a
ab(2) = b
a = ab(2)
b = ab(1)
End Sub

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 25.07.2006 (Вт) 20:34

Tarik
Отличное решение. Спасибо. :)

XPAHuTEJIb
Сделал даже больше чем нужно(объединение строк из разных мест), возьму в коллекцию вдруг пригодится. Спасибо. :cheers:

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 25.07.2006 (Вт) 20:51

Sub swap(a As String, b As String)
Dim ab(2)
ab(1) = a
ab(2) = b
a = ab(2)
b = ab(1)
End Sub


Зачем писать уже написанное... :roll: Swap -- это стандартная функция...
И что самое интересное, синтаксис у неё точно такой и называется она так же :)
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

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

Сообщение GSerg » 25.07.2006 (Вт) 20:55

Роман-вб
Покажешь?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 25.07.2006 (Вт) 20:59

Прошу прощения :?
Перепутал... Точнее по старой памяти...
В PDS'е есть...
SWAP variable1, variable2

Usage Notes
■ SWAP is an assignment statement that exchanges the values of two
variables.
■ Any type of variable can be swapped (integer, long, single
precision, double precision, string, currency, or record). However,
if the two variables are not exactly the same type, BASIC generates
the error message, "Type mismatch."



Да. Действительно такого нет на VB6... :roll:
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Sacred Phoenix
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 22.07.2006 (Сб) 18:20

Сообщение Sacred Phoenix » 26.07.2006 (Ср) 17:51

2 Роман-вб: а обязательно массив? да и ещё из двух элементов?
Код: Выделить всё
Private Sub Swap(ByRef S1 As String, ByRef S2 As String)
Dim S3 As String

   S3 = S1
   S1 = S2
   S2 = S3
End Sub

Роман-вб
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 520
Зарегистрирован: 04.04.2006 (Вт) 9:40
Откуда: Средняя полоса

Сообщение Роман-вб » 26.07.2006 (Ср) 18:00

Sacred Phoenix
а я при чём? :) Я ошибся, и попросил прощенияя. И тот код я даже не коментировал...
P.S. А массив там кстати из 3-х эл-тов :wink:
Жить ещё 2 недели, работы на 8 лет, но я докажу на деле, на что способен аскет!

Sacred Phoenix
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 22.07.2006 (Сб) 18:20

Сообщение Sacred Phoenix » 28.07.2006 (Пт) 19:54

Роман-вб
Упс, я не сразу понял, за что именно ты просишь прощения... :)
ЗЫ. Массив мог быть и из двух элементов... Если был Option Base 1... :wink:


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

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

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

    TopList