SEPARAR DATA E TEXTO DE UM CAMPO - AGORA COMREGEXP

FBUR 02/12/2014 20:51:53
#442948
Boa tarde!

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.
FILMAN 02/12/2014 23:12:40
#442950
Veja se ajuda

E necessário adaptar em cima das tabelas de seu sistema
JABA 03/12/2014 01:27:37
#442952
Criei esse exemplo aqui em VB.NET. Veja se lhe atente.
FBUR 03/12/2014 12:56:57
#442959
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 é?
LVFIOROT 03/12/2014 13:38:36
#442962

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));
FBUR 03/12/2014 14:14:24
#442964
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.
Tópico encerrado , respostas não são mais permitidas