MANIPULAR STRING
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
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
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?
vc pode trabalhar com uma arvore de operações matematicas
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.
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.
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
.
() = 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
.
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 .
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 .
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 ?
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 ?
consegui fazer o loop usando o like
OBRIGADO A TODOS
OBRIGADO A TODOS
Tópico encerrado , respostas não são mais permitidas