MANIPULAR STRING

GERARDA 21/04/2012 22:17:07
#400456
recebo a seguinte string [Ô]5(12(AAY)AY3A)[Ô]
e nao estou conseguindo achar uma solucao
essa string é como se fosse uma string compactada, QUE EU PRECISO DESCOMPACTAR

pegando a parte 12(AAY) sao 12 VEZES [Ô]AAY[Ô] entao a string ficaria assim

5(AAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAY3A)

que sao 5 vezes [Ô]AAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAY3A[Ô] entao a string ficaria assim

[Ô]AAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAY3AAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAY3AAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAY3AAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAY3AAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAY3A[Ô]

agora tem a parte do 3A que sao 3 vezes [Ô]A[Ô] ENTAO FICARIA FINALMENTE ASSIM

[Ô]AAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAA[Ô]

nao sei se consegui explicar direito

o programa recebe a string assim recebo a seguinte string [Ô]5(12(AAY)AY3A)[Ô] e tem que descompactar para [Ô]AAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAAAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAAYAYAAA[Ô]

se alguem poder me ajudar ! agradeço

obrigado

MARCELO.TREZE 22/04/2012 00:21:51
#400459
A questão inicial é, as string serão sempre neste estilo, pode haver variaé você ções, pois a primeira coisa é achar um padrão, a principio seria varrer a string a e cada valor numérico criar as repetições, porém existe a questão de verificar qual calculo será efetuado primeiro, conforme os parenteses, é você mesma que cria estas compactações?

LVFIOROT 22/04/2012 10:23:42
#400461
vc pode trabalhar com uma arvore de operações matematicas
GERARDA 22/04/2012 10:26:44
#400462
Marcelo recebo as strings de um arquivo de texto e tenho que descompactalas

ex. do arq de texto:

283.154P282.
Y282.77(HB)282.-283.154*282.
283.2(14+.AA12+AA.22+)14+.AA12+AA.14+282.
260.3(38.p*Q10.lZy)297.
A290.2(30.p*Q18.lZy)320.

LVFIOROT 22/04/2012 10:53:45
#400465
quais sao os simbolos de operação?

() = multiplicação
numero = multiplicação
* e multiplicador ou caracter?
. é caracter ?
+ e soma ou caracter?
- e subtração ou caracter?

ou seja, quais sao os caracteres de intrepetração e quais os caracteres
.
GERARDA 22/04/2012 12:29:38
#400466
LVFIOROT somente os () sao sinais de multiplicação
o + é um caractere

correção do ex. do texto

283.154P282.
Y282.77(HB)282.
283.2(14+.AA12+AA.22+)14+.AA12+AA.14+282.
260.3(38.p*Q10.lZy)297.
A290.2(30.p*Q18.lZy)320.

os parentes consegui retirar com esta função

Function Tira_parentesis(dequem As String)
[ô]5(12(AAY)AY3A)
Dim verifica As Long, contanocalculo As Single
Dim contano As Single, tsubstring As Boolean, tnum As Boolean
Dim strtrocadaini As Single, strtrocadafina As Single
Dim strsub As String, strsubini As Single, strsubfina As Single
Dim strnum As String, strnumini As Single, strnumfina As Single

verifica = InStr(dequem, [Ô])[Ô])

While verifica <> 0
tsubstring = False
tnum = False
[ô]final da string que vai ser trocada
strtrocadafina = verifica + 1 [ô]9
[ô]final da substring
strsubfina = verifica [ô]8

For contano = verifica To 1 Step -1
If tsubstring = False And tnum = False And Mid(dequem, contano, 1) = [Ô]([Ô] Then
[ô]inicio substring
strsubini = contano + 1 [ô]6
[ô]final string numero
strnumfina = contano [ô]4
tsubstring = True
contano = contano - 1
End If
If tsubstring = True And tnum = False Then
If IsNumeric(Mid(dequem, contano, 1)) = False Or contano = 1 Then
[ô]inicio string numero
strnumini = contano + 1 [ô]2
[ô]inicio da string que vai ser trocada
strtrocadaini = contano + 1 [ô] 3
tnum = True
End If
End If

If tsubstring = True And tnum = True Then
GoSub faizcalculo
[ô]MsgBox Mid(dequem, IIf(strtrocadaini = 2, 1, strtrocadaini), strtrocadafina - IIf(strtrocadaini = 2, 1, strtrocadaini))
dequem = Replace(dequem, Mid(dequem, IIf(strtrocadaini = 2, 1, strtrocadaini), strtrocadafina - IIf(strtrocadaini = 2, 1, strtrocadaini)), strsub)
Exit For
End If
Next


verifica = InStr(dequem, [Ô])[Ô])
Wend

Tira_parentesis = dequem

Exit Function

faizcalculo:
For contanocalculo = 1 To Mid(dequem, IIf(strnumfina - strnumini = 0, 1, strnumini), IIf(strnumfina - strnumini = 0, 1, strnumfina - strnumini))
strsub = strsub & Mid(dequem, strsubini, strsubfina - strsubini)
Next

Return


End Function

mas ainda falta a multiplicação dos numeros que nao tem parentesis

tipo no ex. texto

283.154P282.

sao 283 vezes o .
154 vezes o P
282 vezes o .




GERARDA 22/04/2012 12:53:19
#400468
veja bem consegui fazer uma função para retirar os numeros


Function tira_numeros(dequem As String)

Dim novastr As String, strnumini As Single, strnumfina As Single, strsub As String
Dim achonum As Boolean, strnum As String

For contano = 1 To Len(dequem)

If IsNumeric(Mid(dequem, contano, 1)) = True Then
If achonum = False Then
achonum = True
strnum = Mid(dequem, contano, 1)
strnumini = contano
Else
strnum = strnum & Mid(dequem, contano, 1)
End If
ElseIf IsNumeric(Mid(dequem, contano, 1)) = False And achonum = True Then
strnumfina = contano + 1
MsgBox Mid(dequem, strnumini, strnumfina - strnumini)
dequem = Replace(dequem, Mid(dequem, strnumini, strnumfina - strnumini), String(strnum, Mid(dequem, contano, 1)))
achonum = False
End If
Next



tira_numeros = dequem

End Function

mas nao estou achando jeito de faser o loop para que enquanto tiver numero na string o loop nao pare de mandar para a funcao

como verificar se tem numero em uma string ?
GERARDA 22/04/2012 13:28:09
#400470
consegui fazer o loop usando o like

OBRIGADO A TODOS
Tópico encerrado , respostas não são mais permitidas