No exemplo a seguir temos uma função que irá abrir um arquivo cujo o caminho foi recebido por parâmetro e percorrer por este arquivo caractere por caractere substituindo caracteres especiais como “ã, ó ,ç ,â …” e o “?” que representa nulo e pode trazer problemas dependendo da necessidade.
Este exemplo é baseado neste exemplo 4GL/ABL: How to clean the NULL characters from a file? disponibilizado pela Openedge.
No caso demostrado a baixo estamos substituindo os ASC’s 0 (Nulo), 63 (?) e 10 (Quebra de linha) por 32 que é em branco ou “”. Também usamos uma include disponibilizada pela TOTVs para Datasul que troca caracteres especiais por caracteres normais, por exemplo Ç por C, essa include é a {include/i-freeac.i}.
{include/i-freeac.i}
FUNCTION remove-nulo-caracterEspecial RETURNS CHARACTER
(input vPathArquivo as character ) :
/*------------------------------------------------------------------------------
Remover os campos nulo e troca os caracteres especiais
em arquivos regados pelo sistema para que não vá ? no lugar de vazio
------------------------------------------------------------------------------*/
DEFINE VARIABLE vArquivo AS MEMPTR NO-UNDO.
DEFINE VARIABLE ArquicoComNulo AS CHARACTER NO-UNDO.
DEFINE VARIABLE ArquivoSemNulo AS CHARACTER NO-UNDO.
DEFINE VARIABLE vCont AS INTEGER NO-UNDO.
DEFINE VARIABLE vCaracterLimpo AS CHARACTER NO-UNDO.
/* Obter o nome e tamanho do arquivos */
/* Observação: neste exemplo estamos substituindo o arquivo com caracteres especiais pelo arquivo formatado */
ASSIGN
ArquicoComNulo = vPathArquivo
ArquivoSemNulo = vPathArquivo
FILE-INFO:FILE-NAME = ArquicoComNulo
SET-SIZE(vArquivo) = FILE-INFO:FILE-SIZE.
/* Importar o arquivo com nulos para a variavel */
INPUT FROM VALUE(ArquicoComNulo) BINARY NO-MAP NO-CONVERT.
IMPORT UNFORMATTED vArquivo.
INPUT CLOSE.
/* Substituindo nulo=0, ?=63, quebraLinha=10 pelo espaço em brnaco=32 */
/* para descrobrir o CHR do ? usei o ASC("?") */
/* Iniciando da posição 200 pois alguns arquivos tem configurações no principio e alterar pode corromper, exemplo Word e Excel
más é uma estimativa e a posição pode variar */
DO vCont = 200 TO FILE-INFO:FILE-SIZE:
IF GET-BYTE(vArquivo, vCont) = 0 then /* Nulo */
PUT-BYTE(vArquivo, vCont) = 32.
else
IF GET-BYTE(vArquivo, vCont) = 63 then /* ? */
PUT-BYTE(vArquivo, vCont) = 32.
else
IF GET-BYTE(vArquivo, vCont) = 10 then /* Quebra de linha */
PUT-BYTE(vArquivo, vCont) = 32.
else
/* Abaixo do 123 estão os caracteres normais (ABCD...) então não precisamos trata-los */
IF GET-BYTE(vArquivo, vCont) > 123 then do: /* Caracteres depois do normal */
/* Função na include da TOTVs */
assign vCaracterLimpo = fn-free-accent(CHR(GET-BYTE(vArquivo, vCont))).
PUT-BYTE(vArquivo, vCont) = asc(vCaracterLimpo).
end.
END.
/* Exportando os dados corrigidos para o arquivo de saída */
OUTPUT TO VALUE(ArquivoSemNulo) BINARY NO-MAP CONVERT TARGET "UTF-8".
EXPORT vArquivo.
OUTPUT CLOSE.
RETURN vPathArquivo. /* Function return value. */
END FUNCTION.
O exemplo passado está em uma função, assim basta executa-la passando o caminho do arquivo a ser formatado, exemplo remove-nulo-caracterEspecial(“C:\temp\arquivo.csv”).