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

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

Re: [shell-script] Delimitadores de trecho de texto


From: jimmy
Subject: Re: [shell-script] Delimitadores de trecho de texto
Date: Wed, 29 Oct 2008 17:42:19 -0200
User-agent: Mutt/1.4.2.3i

On Wed, Oct 29, 2008 at 07:23:31PM -0000, Cristiano Ferrari wrote:
> Caríssimos, boa tarde.
> 
> Preciso importar um grande volume de dados de um arquivo texto imenso e 
> possuo um arquivo texto cujo conteúdo quase segue um padrão. O "quase"
> é que me mata.
> 
> Pensem em um arquivo com várias fichas, cada uma com vários campos, e
> todas as fichas separadas por um delimitador. Algo do tipo:
> 
> <exemplo>
> 
>    Ficha:   01
>  Nome:    Fulano
>    Resumo:    blabla
> Telefone:   44 xxxx-9460
>   E-mail:   address@hidden
> 
> -----
> 
>  Ficha:02
>    Nome: Beltrano
>  Resumo: blabla
>   Telefone: 44 xxxx-2534 E-mail: address@hidden
> 
> -----
> 
> Ficha:  03      Nome:     Cicrano
>   Resumo:    blabla
>   Telefone:    44 xxxx-2300
>  E-mail:  address@hidden
> 
> </exemplo>
> 
> -- detalhe: a quantidade de espaços é literal e proposital
> 
> Preciso ler o arquivo e criar uma tabela com os campos FICHA, NOME,
> RESUMO, TELEFONE, EMAIL e o conteúdo de cada ficha nas linhas.
> 
> Um dos problemas é que o campo "resumo: blabla" pode ter qualquer
> conteúdo e ir de 0 (não existir) a infinitas linhas. 
> 
> Outro, é que os campos não são tabulados nem alinhados.
> 
> Mais um: nem todo campo está sozinho em uma linha. Como no caso da
> ficha 2, email e telefone estão na mesma linha ou, no caso da ficha 3,
> "ficha" e "nome" estão na mesma linha.
> 
> Por fim, os espaços entre
> 
> Portanto, tudo o que eu tenho de padrão é 
> 
> 1. O ":" separa o rótulo do campo do conteúdo do campo
> 
> 2. O "-----" separa uma ficha da outra
> 
> 3. Em toda a ficha o primeiro campo é "ficha"
> 
> Estou tentando desenvolver um algorítimo em shell, usando grep, sed,
> awk ou o que mais for possível que me permita varrer o arquivo e fazer
> a importação.
> 
> Identificar os campos e relacionar cada campo ao seu conteúdo é
> relativamente fácil. 
> 
> A dificuldade está em dizer que o conteúdo "address@hidden" que
> achei e relacionei com o campo "EMAIL" pertence à ficha 02.
> 
> Pensei em usar os delimitadores "-----" como marcadores de ficha, onde
> eu localizaria todas linhas com o padrão "ficha : conteúdo" colocando
> o resultado desta pesquisa em um laço onde eu novamente varreria o
> arquivo pegando o conteúdo dele esta ocorrência até o próximo
> delimitador "-----" e, dentro de outro laço, pesquisaria os demais
> campos, já sabendo que eles se referem à ficha tal.
> 
> O meu problema está em como fazer para pegar o conteúdo do padrão
> localizado "ficha : conteúdo" até o próximo delimitador "-----" o grep
> me permite retornar uma quantidade X de linhas antes e/ou depois, mas
> esta quantidade varia de acordo com o conteúdo do campo "resumo" que
> pode ocupar várias linhas. Então eu preciso arrumar um jeito de contar
> quantas linhas existem entre a ocorrência do padrão "ficha | conteúdo"
> e a próxima ocorrrência do padrão "-----". Isso implica em varrer o
> arquivo muitas vezes.
> 
> Alguém poderia me dar uma idéia de um jeito melhor?
> 
> 
> 
> 
> ------------------------------------

eu estava resolvendo um problema parecido, embora menos complexo, usando
o sed; 
fiz umas poucas adatações:

#!/usr/bin/sed -f

/^ *Ficha:/{
  :a;
  N;
  s/\n/; /;
  /; -----/{
    bb;
  }
  s/ \+/ /g;
  ba;
}
:b;
s/\n//g;
s/^ \+//;

esse script não está completo para a tarefa que você deseja,
faça um teste e verifique se lhe serve, podemos terminá-lo ou buscar
outra saída se for o caso.


reply via email to

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