Amiguinho,
Somente complementando, eu encontrei algo que pode servir para voce e para todos os outros que pesquisarem sobre o assunto.
Levando em consideração o ao que o amigo Malgno postou no link/tópico do meu post anterior cheguei a uma função em minha biblioteca que pode auxiliar:
Código: Selecionar todos
/*
* Array bidimensional com a posicao inicial e o tamanho de cada campo num string
* ex: { {1,5}, {6,2}, {8,4}, {12,15} }
*/
FUNCTION DefPiece( pArray )
PUBLIC ST_Piece
if pArray != NIL
ST_Piece := pArray
endif
return ST_Piece
/*
* Array bidimensional com a posicao inicial e o tamanho de cada campo num string
* Pstring - string a ser dividida em campos
* PnCampo - numero do campo de acordo com a definicao em DefPiece
* Preplace - novo valor no string
*/
FUNCTION SetPiece( Pstring, PnCampo, Preplace )
LOCAL tRet := substr( Pstring, ST_Piece[PnCampo][1], ST_Piece[PnCampo][2] )
if Preplace != NIL
stuff( Pstring, ST_Piece[PnCampo][1], ST_Piece[PnCampo][2], Preplace )
endif
return tRet
Analisando o texto:
Código: Selecionar todos
4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
Verificando as posições posso gerar o array com as seguintes posições/tamanhos:
Código: Selecionar todos
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
Eu usaria a função DefPiece() assim:
Código: Selecionar todos
...
DefPiece( { {1,4},{6,2},{9,34},{45,13},{59,2},{62,4},{67,5},{73,8},{82,6},{89,10} } )
...
Então processaria meus REPLACEs assim:
Código: Selecionar todos
Pstring := "4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009"
...
replace CODIGO with SetPiece( Pstring, 1, NIL )
replace R with SetPiece( Pstring, 2, NIL )
replace CLIENTE with SetPiece( Pstring, 3, NIL )
replace VENDEDOR with SetPiece( Pstring, 4, NIL )
replace MOEDA with SetPiece( Pstring, 5, NIL )
replace EXTDESC with SetPiece( Pstring, 6, NIL )
replace EQUIP with SetPiece( Pstring, 7, NIL )
replace LINK with SetPiece( Pstring, 8, NIL )
replace VALOR with SetPiece( Pstring, 9, NIL )
replace DATACAD with SetPiece( Pstring, 10, NIL )
...
Veja que a função recebe a posição da string que será manipulada e devolve o resultado conforme as posições/tamanhos contidos no subvetor.
Repare também que não fiz nenhuma consistencia de transformação dos trechos de valores para tipo numérico. Fica a seu cargo.
Os campos acima, por não saber de sua estrutura "quem recebe o quê" coloquei a representação apenas para ilustrar, cabendo a voce colocar corretamente.
É lógico pensar que todo o conteúdo acima foi exemplificado sobre o resultado de seu post, ou seja, sua string, que por estar mal formatada pode rá causar erros nos resultados obtidos em próximas leituras, exemplo:
Código: Selecionar todos
4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 645,00 1,20 735,12 706,76 31/07/2009
5433 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
5874 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 24,50 0,45 856,12 424,76 31/07/2009
Como exemplo das strings acima vemos que os resultado pode não ser obtido com a função acima, pois para que a mesma funciona é necessário que voce tenha.
Minha sugestão é que se o seu sistema gera esta string ou texto, então voce deve gerar a string com separadores diferenciados de forma a poder recuperar com menos erros possiveis. Exemplo:
Código: Selecionar todos
5433|3E|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|YYYYYYYYYYYYY|R$|5,00|60,00|1.253,12|606,76|31/07/2009
Desta forma usando a função StringToArray com o separador "|" voce dificilmente obterá erros.