2008/10/29 Cristiano Ferrari <[EMAIL PROTECTED]> > 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: [EMAIL PROTECTED] > > ----- > > Ficha:02 > Nome: Beltrano > Resumo: blabla > Telefone: 44 xxxx-2534 E-mail: [EMAIL PROTECTED] > > ----- > > Ficha: 03 Nome: Cicrano > Resumo: blabla > Telefone: 44 xxxx-2300 > E-mail: [EMAIL PROTECTED] > > </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 "[EMAIL PROTECTED]" 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: [EMAIL PROTECTED] ----- Ficha:02 Nome: Beltrano Resumo: blabla Telefone: 44 xxxx-2534 E-mail: [EMAIL PROTECTED] ----- Ficha: 03 Nome: Cicrano Resumo: blabla Telefone: 44 xxxx-2300 E-mail: [EMAIL PROTECTED] 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]