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: Fabiano Caixeta Duarte
Subject: Re: [shell-script] Delimitadores de trecho de texto
Date: Thu, 30 Oct 2008 00:00:37 -0200

2008/10/29 Cristiano Ferrari <address@hidden>

> 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?
>

Não é a solução completa, mas já organiza bem o texto:

tr -s '( |\n)' < arquivo | sed -r '/^ /s///;s/
(Ficha|Nome|Resumo|Telefone|E-mail):/\n\1:/g'
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


A continuação da solução pode ser feita com awk, por exemplo. Neste caso,
use o ---- como delimitador de registro e \n como delimitador de campo.

-- 
Fabiano Caixeta Duarte
Especialista em Redes de Computadores
Linux User #195299
Ribeirão Preto - SP


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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