SEPARAR DATA E TEXTO DE UM CAMPO - AGORA COMREGEXP
Boa tarde!
Tenho uma base de dados onde o campo [Ô]historico[Ô] é do tipo MEDIUNTEXT e tem datas e textos misturados. Ex:
Existem mais de 2000 linhas na tabela. E em todas elas este campo está desta forma (data e textos misturados)
Isso é um bloco de texto só (as quebras de linha são ENTER mesmo). Veja que toda data é seguida por um texto. Uma data, um texto, uma data, um texto, e assim por diante.
Eu preciso separar este bloco de texto e jogá-lo em dois campos de outra tabela. Nesta nova tabela os campos [Ô]data_evento[Ô] e [Ô]descricao[Ô] recebem a data e o texto extraÃdos, respectivamente. Então o bloco acima ficaria como abaixo, cada um no seu campo e desta vez cada linha é um registro na tabela.
Eu até tenho idéia de como fazer isso, mas não sei se é a melhor forma. Assim:
- faço uma busca no campo histórico.
- ao encontrar uma data guardo a posição dela na string.
- ao encontrar uma outra data, sei que o texto acaba antes dela.
- gravo a data encontrada primeiro e o texto vai até antes do inÃcio da segunda data.
- guardo a posição desta segunda data e faço tudo novamente em loop até o final dos registros.
Pensei em usar as funções InStr() e Mid(). Ainda não escrevi o algoritmo, mas está parecendo bem cansativo. Será que tem uma forma mais simples?
Abs.
Tenho uma base de dados onde o campo [Ô]historico[Ô] é do tipo MEDIUNTEXT e tem datas e textos misturados. Ex:
01/01/2001 - Bla bla bla bla
bla bla bla 10/02/01 beltrano ciclano
fulano 15/11/02 teste teste teste 25/12/2004
how how how.
Existem mais de 2000 linhas na tabela. E em todas elas este campo está desta forma (data e textos misturados)
Isso é um bloco de texto só (as quebras de linha são ENTER mesmo). Veja que toda data é seguida por um texto. Uma data, um texto, uma data, um texto, e assim por diante.
Eu preciso separar este bloco de texto e jogá-lo em dois campos de outra tabela. Nesta nova tabela os campos [Ô]data_evento[Ô] e [Ô]descricao[Ô] recebem a data e o texto extraÃdos, respectivamente. Então o bloco acima ficaria como abaixo, cada um no seu campo e desta vez cada linha é um registro na tabela.
01/01/2001 Bla bla bla bla bla bla bla
10/02/2001 beltrano ciclano fulano (já corrigindo a data de 10/02/01 para 10/02/2001)
15/11/2002 teste teste teste
25/12/2004 how how how
Eu até tenho idéia de como fazer isso, mas não sei se é a melhor forma. Assim:
- faço uma busca no campo histórico.
- ao encontrar uma data guardo a posição dela na string.
- ao encontrar uma outra data, sei que o texto acaba antes dela.
- gravo a data encontrada primeiro e o texto vai até antes do inÃcio da segunda data.
- guardo a posição desta segunda data e faço tudo novamente em loop até o final dos registros.
Pensei em usar as funções InStr() e Mid(). Ainda não escrevi o algoritmo, mas está parecendo bem cansativo. Será que tem uma forma mais simples?
Abs.
Veja se ajuda
E necessário adaptar em cima das tabelas de seu sistema
E necessário adaptar em cima das tabelas de seu sistema
Criei esse exemplo aqui em VB.NET. Veja se lhe atente.
Bom dia!
Meus prezados, obrigado pelas contribuições. Mas resolvi partir para expressões regulares. Tenho mais de 2000 linhas e este campo tem milhares de caracteres. AÃ para piorar, conforme fui trabalhando com os dados, vi que o camarada escreveu datas nestes formatos:
25/12/2014
25/12/14
25-12-14
25.12.14
05/09/2000
5/9/00
5.9.00
5-9-00
05/9/2000
5/09/00
E as variações disso
Com expressões regulares até que estou conseguindo. é muito fácil tratar as excessões. Só tive uma dúvida (só vou postar a expressão, não o código todo):
Na expressao [Ô]([0-9][0-9])[Ô] me retorna qualquer número entre 00 e 99 (para efeito do exemplo, não vamos considerar que as datas chegam a estes números, ok?).
Já na expressão [Ô]([0-9]{2})[Ô] seria a mesma coisa. Diz que pode ser qualquer número de 0 à 9, mas exatamente com 2 caracteres.
Até aqui tudo bem. Funciona.
O problema foi quando quis fazer a expressão assim: [Ô](1[0-9]{2})[Ô] Isso deveria me dizer: Começa com 1, seguido por qualquer número de 0 à 9, exatamente com 2 caracteres (10,11,12,13,14.... até 19) Mas essa expressão dá erro.
Mas aÃ, se eu retiro a condição {2} (exatamente com 2 caracteres) ela funciona: [Ô](1[0-9])[Ô]
Ou se eu retiro o 1, ela também funciona: ([0-9]{2})
Ou seja,
([0-9]{2}) - funciona
(1[0-9]) - funciona
Mas juntando as duas: (1[0-9]{2}) Não funciona.
Deveria funcionar, não é?
Meus prezados, obrigado pelas contribuições. Mas resolvi partir para expressões regulares. Tenho mais de 2000 linhas e este campo tem milhares de caracteres. AÃ para piorar, conforme fui trabalhando com os dados, vi que o camarada escreveu datas nestes formatos:
25/12/2014
25/12/14
25-12-14
25.12.14
05/09/2000
5/9/00
5.9.00
5-9-00
05/9/2000
5/09/00
E as variações disso
Com expressões regulares até que estou conseguindo. é muito fácil tratar as excessões. Só tive uma dúvida (só vou postar a expressão, não o código todo):
Na expressao [Ô]([0-9][0-9])[Ô] me retorna qualquer número entre 00 e 99 (para efeito do exemplo, não vamos considerar que as datas chegam a estes números, ok?).
Já na expressão [Ô]([0-9]{2})[Ô] seria a mesma coisa. Diz que pode ser qualquer número de 0 à 9, mas exatamente com 2 caracteres.
Até aqui tudo bem. Funciona.
O problema foi quando quis fazer a expressão assim: [Ô](1[0-9]{2})[Ô] Isso deveria me dizer: Começa com 1, seguido por qualquer número de 0 à 9, exatamente com 2 caracteres (10,11,12,13,14.... até 19) Mas essa expressão dá erro.
Mas aÃ, se eu retiro a condição {2} (exatamente com 2 caracteres) ela funciona: [Ô](1[0-9])[Ô]
Ou se eu retiro o 1, ela também funciona: ([0-9]{2})
Ou seja,
([0-9]{2}) - funciona
(1[0-9]) - funciona
Mas juntando as duas: (1[0-9]{2}) Não funciona.
Deveria funcionar, não é?
Quando você usa isso 1[0-9]{2} ele procura por isso (1NN).
teste
string v = [Ô]12.12.12[Ô];
string v1 = [Ô]122.12.12[Ô];
string v2 = [Ô]12.312.12[Ô];
Console.WriteLine(Regex.Replace(v, [Ô][0-9]{2}[Ô],string.Empty));
Console.WriteLine(Regex.Replace(v, [Ô]1[0-9][Ô], string.Empty));
Console.WriteLine(Regex.Replace(v, [Ô]1[0-9]{2}[Ô], string.Empty));
Console.WriteLine(Regex.Replace(v1, [Ô]1[0-9]{2}[Ô], string.Empty));
Console.WriteLine(Regex.Replace(v2, [Ô]1[0-9]{2}[Ô], string.Empty));
Vc tem razão LVFIOROT.
Para conseguir o resultado que desejo é necessário agrupar a expressão de forma correta, assim:
(1([0-9]{1}))
A condição {1} refere-se à lista [0-9] e não para toda a expressão.
Agora foi.
Abs.
Para conseguir o resultado que desejo é necessário agrupar a expressão de forma correta, assim:
(1([0-9]{1}))
A condição {1} refere-se à lista [0-9] e não para toda a expressão.
Agora foi.
Abs.
Tópico encerrado , respostas não são mais permitidas