shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Ajuda Rastreamento Correios


From: Cristiano Ferrari
Subject: Re: Ajuda Rastreamento Correios
Date: Thu, 09 Jul 2009 15:49:37 -0000
User-agent: eGroups-EW/0.82

--- Em address@hidden, "Ernander (Nander)" <ernander@...> escreveu
>
> Bom dia A Todos!
> 
> Primeiramente gostaria de pedir Desculpas pela gafe do e-mail em html. E
> para me redimir todos os exemplos que darei são impreterivelmente  no
> pastebin. Segundo que eu estive fora e não pude responder em tempo as
> atenções ao meu problema.
> 
> Voltando ao assunto, estou comendo ER's para tentar enten der e fazer tudo
> para obter um melhor resultado. A Solução do Cristiano Ferrari, como sempre
> um grande colaborador da Lista, ajudou muito mas com o "head -n 2" estava
> pegando uma linha a mais, o que foi consertado com um "head -n 1" ( basico
> he he ) .
> 
> Ate agora Bakana! O problema Agora é :
> 
> como recebo um arquivo com as movimentações mensais desta forma:
> 
> ver 1º Exemplo do pastebin
> 
> preciso pegar o nome do Cliente (2º Campo), data da postagem (6º campo),
> numero da encomenda (7º campo) e jogar junto com o retono da verificação
> junto ao site dos correios  a Data(1º campo de retorno), hora(segundo campo
> de retorno) e o Status da encomenda( último campo de retorno) ( vide 2º
> exemplo pastebin).
> 
> Nisso montando a Seguinte saída:
> 
> Vide 3 exemplo pastebin
> 
> Bom ate então, com a ajuda de vocês a tarefa parecia simples mas quando me
> deparei que tem cidade com um nome maior que do de DOM PEDRO PRIMEIRO, e que
> não conseguia buscar com um padrão o Status e nem o nome do Cliente pois o
> numero de espaços é enorme e quase não é mensurável.
> 
> Como fazer para pegar a String com espaços tanto no nome do Cliente (
> Arquivo de entrada) e do so Status na pesquisa do site ( sabendo que tem
> Cidades com nomes muito grandes)
> 
> o meu simplório script segue:
> 
> Vide exemplo 4 do pastebin:
> 
> Se eu jogo o resultado da busca no site  em uma variável   RESULTADO da
> busca no site  e tento pegar somente o que me interessa assim:
> 
> echo $RESULTADO | awk '{ print $1 ";" $2 ";" $4 }'
> 
> Não Consigo pegar Somente o Status  pois tenho Status Diversos como entregue
> e Aguardando retirada. O mesmo ocorre qdo tento pegar o nome do Cliente que
> tem espaços. ja no caso do Cliente eu poderia remover os Espaços do Arquivo
> e trocar por UNDERLINE mas como proceder no retorno do Site?
> 
> Julio, como estou comendo o Seu LIVRINHO ( HE HE HE ), Aliás muito bom e
> estou engatinhando nas ER's poderia me explicar a Sua  onlinER ? pois não
> funcionou aqui comigo. Quando vc se refere a  arquivo na ER:
> 
> 
> grep -A2 '[0-3][0-9]/[0-1][0-9]/20[0-1] [0-9] [0-2][0-9]:[0-5][0-9]' arquivo
> | tail -2 | tr -d '\n'
> 
> Não entendi pois o retono é via pesquisa do Lynx e tambem havia substituido
> pela ER do Cristiano e não deu certo.
> 
> 
> valeu mesmo a ajuda e contem comigo no que eu puder ajudar!


Ilustre Ernander.

Se você tem o livro do Júlio, dá uma procurada nele sobre a variável $IFS 
(internal field separator). É por ela que você começa a solução do seu problema.

Primeiro, você não precisa passar a linha inteira no while e depois ficar 
cortando ela para achar os seus campos. Teu arquivo de origem é um CSV 
(delimitado por ";"), você já tem os campos separados. Basta informá-los ao 
while com uma sintaxe parecida com isto:

while read VAR1 VAR2 ... VARn ; do 
   comando1
   comando2
done < /tmp/arquivo_origem.txt

Para cada campo no seu arquivo de origem, informe o nome de uma variável após o 
read (CAMPO1=VAR1, CAMPO2=VAR2, etc.).

Daí, é só pegar o campo certo e fazer o que precisa com ele dentro do laço.

Porém, para que isso aconteça, é necessário que o shell reconheça que os ";" do 
seu arquivo original são os separadores de campos. Por padrão, o IFS do bash é 
o caracter espaço. Para mudar isso, basta, antes do laço (while), mudar o IFS; 
atribuindo outro valor para a variável $IFS. 

Porém, antes de mudar o valor, lembre-se de guardar o original em outra 
variável, e voltar a ele logo após o fim do laço (done). Senão, "coisas 
estranhas" podem acontecer.

Outro detalhe. Para concatenar o BR no número do track, você não precisa fazer 
isso:

ENCOMENDA=`echo $CODIGO`BR

Basta um ENCOMENDA="$CODIGO"BR. Assim, você evita chamar mais um processo 
desnecessário (o echo) e concatena o "BR" no momento que o bash faz a expansão 
das variáveis. (isso também tá no livro do tio Júlio). 

Aliás, no seu caso, você nem precisa se dar o trabalho de fazer isso, basta 
acrescentar o BR como parte da URL que passa ao lynx. Economiza mais uma etapa 
no script.

Já o problema do tamanho do nome da cidade você resolve fácil.

Lembra da dica do Júlio, de trocar o meu sed pelo tr? Adapta ela.

Usa o tr, mas ao invés de fazer com parametro -d, para excluir a ocorrência da 
quebra de linha, troca por um caracter qualquer, que te servirá de marcador 
para um cut. Por exemplo o #.

Assim, você faz um cut para pegar a data, outro para a hora (usando o espaço 
como delimitador) e um outro cut para pegar o staus (usando o # como 
delimtador). Pode também trocar os dois primeiros cuts por um um while, usando 
a mesma lógica que te expliquei no início.

Então, dentro do laço, você joga o resultado da pesquisa vinda do lynx em uma 
variável, depois corta ela e atribui a data em uma variável, a hora em outra, e 
o status em outra.

Como você já tem os valores do arquivo original é só fazer um echo com todas 
variáveis (as que vieram do links e as do arquivo original), intercalados com 
os ";", e terá a saída redondinha.

Geralmente não gosto de postar o script pronto, pois acho que te tira a 
possibilidade de aprender. Então, tenta escrever ele aí que mais tarde e posto 
o meu para você comparar. Até mesmo porque, agora o site dos correios está um 
coco de lento e não vou postar o script sem testá-lo.

Abraço

Cristiano

Abraço









reply via email to

[Prev in Thread] Current Thread [Next in Thread]