Editar arquivo para remover caractere que representa o nulo “?” e caracteres especiais

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”).

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.