by Gio » 04 Nov 2021, 17:20
Boa tarde Thalesduarte.
Você pode usar o
guia rápido de RegEx se precisar criar uma RegEx.
Vou te dar um exemplo semelhante ao que você descreveu:
Exemplo de código Isolando qualquer quantidade de sequencias com o padrão desejado em um arquivo de texto que contém 3 valores:
Code: Select all
#Persistent
; Primeiro vamos criar uma amostra de texto que contenha o padrão desejado repetido 3x.
Texto_inteiro =
(
arquivo de exemplo número 4
data: xx/xx/xxxx
empresa: abc materiais elétricos ltda
cliente: jonas
hora da compra: 15:59
produto: escova de dentes amarela com tufo azul modelo dinossauros
unidade: caixa
quantidade: 2
valor unitário R$: 7.296,41
Valor total R$: 14.592,82
cliente: maria
hora da compra: 16:36
produto: régua escolar 30cm
unidade: caixa
quantidade: 3
valor unitário R$: 8.726,40
Valor total R$: 26.179,20
cliente: claudio
hora da compra: 16:50
produto: unidades de cd-rom antigos
unidade: caixa
quantidade: 2
valor unitário R$: 3.710,40
Valor total R$: 7.420,80
)
; A rotina para buscar os correspondentes-de-padrão desejados inicia aqui.
Total_De_Resultados := 0 ; Iniciamos uma variável de contagem
While (StrLen(Texto_inteiro) > 0) ; E depois um loop que roda enquanto o texto ainda existe (Lógica: o texto será cortado até a posição + 14 sempre que um valor for encontrado para que o loop reinicie. naturalmente, uma hora não haverá mais padrões, ponto onde terminaremos o loop)
{
Posicao := RegExMatch(Texto_inteiro, "Valor\stotal\sR\$:\s\d{1,3}\.\d{1,3},\d{1,2}", Resultado) ; Nosso padrão será: "Valor" seguido de um espaço, seguido de "total", seguido de outro espaço, seguido de "R$", seguido de dois pontos, seguido de um espaço, seguido de uma sequência de 1 a 3 dígitos numéricos, seguido de um ponto, seguido de uma sequência de 1 a 3 dígitos numéricos, seguido de uma vírgula, seguido de uma sequência de 1 a 2 dígitos numéricos. Isso vai pegar números até 999.999,99
If !(Posicao > 0) ; Se a posição NÃO for maior que zero, então o comando não encontrou o padrão.
{
Posicao := RegExMatch(Texto_inteiro, "Valor\stotal\sR\$:\s\d{1,3},\d{1,2}", Resultado) ; Se isso ocorreu, buscamos OUTRO padrão semelhante (números até 999,99).
If !(Posicao > 0) ; Se este padrão também não foi encontrado...
{
Break ; Terminamos o loop.
}
}
Resultado_%A_index% := Resultado ; Este código executa obviamente se algum padrão acima foi encontrado. Primeiro, salva o correspondete-de-padrão encontrado.
Total_De_Resultados++ ; Depois, aumenta o contagem de resultados.
QUANTIDADE_DE_CARACTERES_A_REMOVER := Posicao + 14 ; Agora conta a posição do correspondente-de-padrão encontrado + 14 ("valor total R$" contém 14 caracteres, e faz parte do padrão. O objetivo é cortar até esses caracteres para que a próxima busca não encontra o mesmo correspondente-de-padrão)
StringTrimLeft, Texto_inteiro, Texto_inteiro, %QUANTIDADE_DE_CARACTERES_A_REMOVER% ; Por fim, remove caracteres do texto original correspondente à posição do correspondente-de-padrão encontrado anteriormente para que o mesmo correspondente-de-padrão não seja encontrado de novo.
}
Loop % Total_De_Resultados ; Por fim fazemos um loop com a contagem de resultados.
{
msgbox % Resultado_%A_index% ; e exibimos os resultados encontrados.
}
Boa tarde Thalesduarte.
Você pode usar o [url=https://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm]guia rápido de RegEx[/url] se precisar criar uma RegEx.
Vou te dar um exemplo semelhante ao que você descreveu:
Exemplo de código Isolando qualquer quantidade de sequencias com o padrão desejado em um arquivo de texto que contém 3 valores:
[code]#Persistent
; Primeiro vamos criar uma amostra de texto que contenha o padrão desejado repetido 3x.
Texto_inteiro =
(
arquivo de exemplo número 4
data: xx/xx/xxxx
empresa: abc materiais elétricos ltda
cliente: jonas
hora da compra: 15:59
produto: escova de dentes amarela com tufo azul modelo dinossauros
unidade: caixa
quantidade: 2
valor unitário R$: 7.296,41
Valor total R$: 14.592,82
cliente: maria
hora da compra: 16:36
produto: régua escolar 30cm
unidade: caixa
quantidade: 3
valor unitário R$: 8.726,40
Valor total R$: 26.179,20
cliente: claudio
hora da compra: 16:50
produto: unidades de cd-rom antigos
unidade: caixa
quantidade: 2
valor unitário R$: 3.710,40
Valor total R$: 7.420,80
)
; A rotina para buscar os correspondentes-de-padrão desejados inicia aqui.
Total_De_Resultados := 0 ; Iniciamos uma variável de contagem
While (StrLen(Texto_inteiro) > 0) ; E depois um loop que roda enquanto o texto ainda existe (Lógica: o texto será cortado até a posição + 14 sempre que um valor for encontrado para que o loop reinicie. naturalmente, uma hora não haverá mais padrões, ponto onde terminaremos o loop)
{
Posicao := RegExMatch(Texto_inteiro, "Valor\stotal\sR\$:\s\d{1,3}\.\d{1,3},\d{1,2}", Resultado) ; Nosso padrão será: "Valor" seguido de um espaço, seguido de "total", seguido de outro espaço, seguido de "R$", seguido de dois pontos, seguido de um espaço, seguido de uma sequência de 1 a 3 dígitos numéricos, seguido de um ponto, seguido de uma sequência de 1 a 3 dígitos numéricos, seguido de uma vírgula, seguido de uma sequência de 1 a 2 dígitos numéricos. Isso vai pegar números até 999.999,99
If !(Posicao > 0) ; Se a posição NÃO for maior que zero, então o comando não encontrou o padrão.
{
Posicao := RegExMatch(Texto_inteiro, "Valor\stotal\sR\$:\s\d{1,3},\d{1,2}", Resultado) ; Se isso ocorreu, buscamos OUTRO padrão semelhante (números até 999,99).
If !(Posicao > 0) ; Se este padrão também não foi encontrado...
{
Break ; Terminamos o loop.
}
}
Resultado_%A_index% := Resultado ; Este código executa obviamente se algum padrão acima foi encontrado. Primeiro, salva o correspondete-de-padrão encontrado.
Total_De_Resultados++ ; Depois, aumenta o contagem de resultados.
QUANTIDADE_DE_CARACTERES_A_REMOVER := Posicao + 14 ; Agora conta a posição do correspondente-de-padrão encontrado + 14 ("valor total R$" contém 14 caracteres, e faz parte do padrão. O objetivo é cortar até esses caracteres para que a próxima busca não encontra o mesmo correspondente-de-padrão)
StringTrimLeft, Texto_inteiro, Texto_inteiro, %QUANTIDADE_DE_CARACTERES_A_REMOVER% ; Por fim, remove caracteres do texto original correspondente à posição do correspondente-de-padrão encontrado anteriormente para que o mesmo correspondente-de-padrão não seja encontrado de novo.
}
Loop % Total_De_Resultados ; Por fim fazemos um loop com a contagem de resultados.
{
msgbox % Resultado_%A_index% ; e exibimos os resultados encontrados.
}[/code]