mlgrassi
(usa Debian)
Enviado em 25/06/2016 - 20:47h
Prezados,
Trabalho com um banco de dados que lê arquivos TXT e importa os dados para as tabelas desse BD.
Como quem gera esses arquivos TXT é um outro sistema (o qual não sou eu quem gerencia), muitas vezes ocorre de o arquivo ser gerado com vários caracteres especiais (diferentes de a-z A-Z 0-9, etc) espalhados por todo o arquivo. Assim sendo, o BD não carrega os dados
No caso, já tenho a lista de caracteres especiais (inválidos durante a validação do TXT) que devo procurar no arquivo texto a fim de comunicar o administrador do sistema para que o mesmo realize a devida remoção/correção dos arquivos.
Eu necessito implementar um script ou, caso os comandos já conhecidos como por exemplo o grep, sed ou awk sejam capazes de fazer isso, que mostre a POSIÇÃO dos caracteres inválidos em cada linha da ocorrencia.
Por exemplo, sendo as 2 linhas abaixo, contidas no arquivo.txt, onde a primeira linha está no padrão correto e a segunda contendo os caracteres inválidos:
RS 20160625 Rua João XVIII, N. 1234 Rui Barbosa Cliente Pré-Pago 2132431243
RS 20160625 Rua Jo¿o XVIII, N. 1234 Rui Barbosa Cliente Prþ¶-Pago 2132431243
Necessito que o script ou comando efetue uma busca no arquivo.txt e retorne algo assim:
Linha 2: Caractere ¿ na posição 19; Caractere þ na posição 59; Caractere ¶ na posição 60
Sei que o grep apenas mostra as linhas onde existe a ocorrência, no entanto não mostra a posição dos caracteres.
Assim sendo implementei o script abaixo o qual o algoritmo está praticamente correto, porém, os caracteres especiais no shell são interpretados como espaço em branco + ponto de interrogação. Alguém poderia me ajudar?
--------------------------------------------------------------------------------------------------------------------------------------------------------------
FILE='arquivo.txt'
LINHA=0
lista_char='€ ƒ … † ‡ ‰ Š ‹ Œ Ž • ™ š › œ ž Ÿ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ'
for i in `cat $FILE`;do
total_char=`echo -n $i | wc -c`;
LINHA=$(( $LINHA + 1 ));
for ((j=1;j<=$total_char;j++));do
aux=`echo -n $i | cut -c $j`;
for z in `echo $lista_char`;do
if [ $aux = $z ];then
echo "Linha $LINHA: encontrado caracter $aux na posicao $j";
fi
done
done
done
--------------------------------------------------------------------------------------------------------------------------------------------------------------
OBS: No meu caso converter o arquivo para outra codificação (UTF-8, ISO-8859-1) além de não resolver meu problema, não é a solução que busco.