Leitura de Arquivo [RESOLVIDO]

1. Leitura de Arquivo [RESOLVIDO]

Diego Ramos
diegoramos

(usa Debian)

Enviado em 24/10/2008 - 12:09h

Olá galera,como estão as coisas?

Estou a alguns dias tentando resolver um problema,gostaria de expor o mesmo aqui na comunidade,se puderem me dar algumas dicas ou idéias,agradeço desde então.

Tenho um arquivo com o seguinte conteúdo:

-------------------Inicio do Arquivo----------------------------
018092008401
100E4010001448 ALAMEDA 11
100E4010001448 ALAMEDA 12
---------------Fim do Arquivo----------------------------------
Na primeira linha : "018092008401"

Temos 12 caracteres,sendo que:
- O primeiro caractere é fixo,sempre 0.
- Os oito caracteres seguintes são uma data(DDMMAAAA).
- Os 3 caracteres restantes são um código de controle.

Na segunda linha : "100E4010001448 ALAMEDA 11".

Temos 26 caracteres,sendo que:
- O Primeiro caractere é fixo,sempre 1.
- O segundo caractere é 0 ou 1.
- O terceiro caractere é 0 ou 1.
- O quarto caractere pode ser E,T ou C.
- Os proximos 10 caracteres são um codigo.
- Os proximos 10 caracteres são outro codigo.


A minha duvida é a seguinte,como eu faço para testar(talvez if) determinadas areas em uma string(pensei tput).
O arquivo é imenso,mas modifiquei pra ficar mais facil de entender.
Espero não ter sido confuso.

Agradeço a atenção de todos.

Abs.





  


2. Re: Leitura de Arquivo [RESOLVIDO]

Sandro Marcell
SMarcell

(usa Slackware)

Enviado em 24/10/2008 - 14:18h

Tu pode tentar utilizar o sed, cut ou mesmo a awk.

Supondo que você queira checar na linha que contêm "018092008401" o valor do código de controle (401) para saber se ele bate com determinado valor, tu poderia fazer assim:

valor=`sed -n 1p < arquivo.txt | sed 's/.\{9\}//'`
if [ $valor -eq xxx ]
then
echo "$valor e exatemente igual a xxx"
else
echo "$valor e diferente de xxx"
fi

A partir desse simples exemplo, acho que já da pra você ter uma idéia de como proceder. Mais detalhes:
man sed
man cut
man awk


3. Re: Leitura de Arquivo [RESOLVIDO]

Diego Ramos
diegoramos

(usa Debian)

Enviado em 24/10/2008 - 14:46h

Me deu uma idéia sim.
O meu objetivo inicial é capturar cada dado e inserir em uma variavel e com essas mesmas vou usar para dar entradas em um banco de dados.
Estou dando uma olhada em umas documentações aqui e ver se consigo. ;]
Grato pela atenção e dedicação.




4. Definição das funções

Diego Ramos
diegoramos

(usa Debian)

Enviado em 24/10/2008 - 16:31h

Sandro,defini 4 funcões que creio que farão todo o meu serviço:

narqs ()
{
for arqs in `ls *.txt`
do
echo $arqs
done
}

qtdarqs ()
{
echo -e "Foram encontrados `narqs | wc -l` registros"
}

pega_dados()
{
if [qtdarqs -le cont];then
for i in narqs${arqs[$cont]} | cat ${1[$cont]} | read HEADER REGISTRO
done
cont++;
fi
}


testa_dados() ## Verifica se o HEADER comeca com 0 e REGISTRO com 1 ,quando verdadeiro da entrada no banco de dados
{

}

_________________________________________________________

Não estou conseguindo terminar de desenvolver a "pega_dados".
Estou usando "bash -x *.sh" como debug,está dando erro com o |
da "pega_dados".
Sabe o porque?
(Inicialmente eu até poderia criar tudo sem função,mas organizei por funções porque já estou vendo que esse script vai aumentar. ;) )



5. Re: Leitura de Arquivo [RESOLVIDO]

Sandro Marcell
SMarcell

(usa Slackware)

Enviado em 25/10/2008 - 02:48h

----------
for i in narqs${arqs[$cont]} | cat ${1[$cont]} | read HEADER REGISTRO
----------

Como o trecho "narqs ... | cat ... | read ..." são comandos, você deve dar precedência a eles, utilizando crases (`).

for i in `narqs${arqs[$cont]} | cat ${1[$cont]} | read HEADER REGISTRO`


6. Re: Leitura de Arquivo [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 25/10/2008 - 11:29h

Talvez isso te ajude:

awk -F ':'
'function data(buga){

print "Data: "substr(buga,2,8)"\n" "Controle: "substr(buga,10,3)};

function desc(string){

print "Segundo: "substr(string,2,1)"\nTerceiro: "substr(string,3,1)"\nQuarto: "substr(string,4,1)"\nCodigo1: "substr(string,5,10)"\nOutro codigo: "substr(string,15,10)}

{ BUGA=substr($1, 1,1); if(BUGA==0) {data($1)} else {desc($1)}}'


A saída desse script fica assim:

Data: 18092008
Controle: 401
Segundo: 0
Terceiro: 0
Quarto: E
Codigo1: 4010001448
Outro codigo: ALAMEDA 1



7. Re: Leitura de Arquivo [RESOLVIDO]

Denis Doria
thuck

(usa Debian)

Enviado em 25/10/2008 - 11:41h

Ops, comi o último caractere:

awk -F ':' 'function data(buga){print "Data: "substr(buga,2,8)"\n" "Controle: "substr(buga,10,3)};function desc(string){print "Segundo: "substr(string,2,1)"\nTerceiro: "substr(string,3,1)"\nQuarto: "substr(string,4,1)"\nCodigo1: "substr(string,5,10)"\nOutro codigo: "substr(string,16,11)} { BUGA=substr($1, 1,1); if(BUGA==0) {data($1)} else {desc($1)}}'

Pronto hehehe

Data: 18092008
Controle: 401
Segundo: 0
Terceiro: 0
Quarto: E
Codigo1: 4010001448
Outro codigo: ALAMEDA 11



8. Quase lá...

Diego Ramos
diegoramos

(usa Debian)

Enviado em 29/10/2008 - 12:22h

Mais uma vez agradeço imensamente a atençao de voces. =]
Vamos ao relatório de bordo. ( :) )

!----------------------------------------------------------------!
Sandro,
Estou me baseando nas idéias que voce tem me dado e consgui alguns exitos.

Denis,
Consegui exito com o exemplo que me passou.
Porem nao entendo muito de awk(=T),mas funcionou sim.
O que esta implicando agora é a questão das outras linhas,teria que implementar uma estrutura de repetição.
obs: eu executei o seu exemplo da seguinte maneira : cat arq.txt | ./script.sh
E estou com Tempo pra terminar esse script,por isso não seria viável fuçar o man do awk no momento. =| ( =T )

!----------------------------------------------------------------!
Atualmente o script se encontra assim :.

________________________INICIO do SCRIPT________________________
#!/bin/bash
## Listando arquivos no diretorio

narqs ()
{
for arqs in `ls *.awd`;
do
echo $arqs
done
}

qtdarqs ()
{
narqs | wc -l
}


## Pega os dados do registro,verifica HEADER e REGISTRO de cada arquivo encontrado

pega_dados()
{
local cont=0;
qtdlin=$(narqs | cat ${arqs[$cont]} | wc -l)
if [ `qtdarqs` -ne "$cont" ];then
if [ "$qtdlin" -ne "$cont" ];then
for i in `narqs${arqs[$cont]} | cat ${1[$cont]} | read HEADER REGISTRO`
do
echo "$HEADER"
echo "\n"
echo "$REGISTRO"
cont++;
done
valida_header $HEADER $REGISTRO
fi
fi
}

valida_header()
{
if [ $1 -eq 0 ]
then
echo "TIPO_REGISTRO $1 Ok!"
pega_dados
else
echo "TIPO_REGISTRO diferente de 0. Abortando."
echo "TIPO REGISTRO(HEADER): $1" >> relatorio.txt
echo "TIPO REGISTRO(DETALHES) : $2" >> relatorio.txt
echo " " >> relatorio.txt
mail -s "Erro na Importacao" admin@domain.com.br < relatorio.txt
pega_dados
fi
}
pega_dados
________________________FIM do SCRIPT________________________

Como já tinha dito,já tinha em mente que o script teria que aumentar,e bem aumentou.
A mudança que teve(ja editada acima) foi em relaçao a segunda linha.
Todos os arquivos que o script terá que ler,terão o seguinte formato:

------------------Inicio do Arquivo----------------------------
018092008401
100E4010001448 ALAMEDA 11
100E4010001448 ALAMEDA 12
......(algo como nas linhas 2 e 3)
---------------Fim do Arquivo----------------------------------

Foi uma pequena mudança no arquivo,mas uma considerável no script(aos meus olhos).

O que tentei fazer com o script é o seguinte :.
1- Listar os arquivos de determinada extensao existente no diretorio atual.(funçao narqs)
2- Pega o primeiro arquivo selecionar,ler a primeira linha e a segunda,verifica se a primeira linha começa com 0,senão,chama o outro arquivo,se sim continua lendo as outras linhas do arquivo.
3- Em caso de algum erro envia o $HEADER(primeira linha) e o $REGISTRO(linha atual),seria interessante enviar tambem o nome do arquivo para o relatorio.

+ Estou depurando,porem estou encontrando algumas coisas das quais não estou entendendo. ( :s )
Se pudessem me ajudar a clarear minhas idéias. ;)
Acho que estou errando em detalhes de codigo,acho que a logica nao esta errada,creio eu.
Na minha ultima depuracao aqui,está acusando erro na linha 45 ( if [ `qtdarqs` -le "$cont" ];then ) :
reg_buster.sh: line 45: [: too many arguments


Agradeço muito a voces. =]
(ansioso)


9. Conseguimos

Diego Ramos
diegoramos

(usa Debian)

Enviado em 30/10/2008 - 15:17h

Enfim,sem erro nenhum. =]


__________________INICIO DO SCRIPT____________________________
#!/bin/bash

## Agradecimentos : SMarcell e thuck ( ambos do VOL )

function main()
{
ls *.awd > arquivos.txt
cont=$(cat arquivos.txt | wc -l);
jlinhas=2;
i=1;

while [ $cont -gt 0 ];
do

ARQX=$(cat arquivos.txt | head -n$i | tail -n1)
digito=$(cat $ARQX | head -n1 | cut -c1)
linx=$(cat $ARQX | wc -l)
clinhas=1;
if [ $digito -eq 0 ];then
HEADER=$(cat $ARQX | head -n1)
REGISTRO=$(cat $ARQX | head -n$jlinhas | tail -n1)


echo "Header : $HEADER"
echo "Registro : $REGISTRO"
jlinhas=`expr $jlinhas + 1`;
until [ $linx -eq $clinhas ];
do
echo "Registro : $REGISTRO"
clinhas=`expr $clinhas + 1`;
jlinhas=`expr $jlinhas + 1`;
done

else
echo "Verificador do arquivo: --> $ARQX <-- diferente de 0,indo para outro arquivo..."
echo " "
sleep 0.9
fi


i=`expr $i + 1`;
cont=`expr $cont - 1`;
jlinhas=`expr $jlinhas + 1`;

done
}

main
_____________________FIM DO SCRIPT____________________________

Falta ainda criar as funções da pegar os arquivos remotamente e dar entrada no banco de dados(onde serão tratadas as cadeiras de caracteres) com esses dados,mas o dificil ja foi. =]

Obrigado mesmo pela ajuda.
Grande abraço










Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts