Formatação/Estrutura de Arquivo - O Que Usar? [RESOLVIDO]

1. Formatação/Estrutura de Arquivo - O Que Usar? [RESOLVIDO]

Eric Guimarães de Sousa Silva
lowbit

(usa Arch Linux)

Enviado em 09/11/2011 - 17:17h

Boa tarde à todos.

Gostaria de entender melhor o que usar (sed? cut?) para a tarefa que planejo executar.

Preciso alterar um arquivo de texto, mas não mudando o seu conteúdo, apenas formatando as informações contidas nele.

Para exemplificar melhor, segue uma linha de registro desse arquivo de texto* (extraído de uma central PABX):

12/09/11 15:42 500 04 <I>1187654321 00:00'55 00000.00 TR

Seria como dizer: Pegue os caracteres de 1 até 8 e dê uma tabulação (ou uma virgula); em seguida, pegue os caracteres 10 até o 14, e assim por diante para os outros campos, e para cada linha do arquivo de texto.

Depois eu importaria isso para um banco de dados, para uma aplicação interpretar os dados.

Não tive muito sucesso em utilizar a busca, porque ainda não entendi direito por onde começar. Não sei se preciso primeiro tirar os espaços em branco, ou primeiro só copiar os campos para outro arquivo e depois tabular. Mas acredito que, com a ferramenta certa, seja possível fazer isto, não é? rs

Desde já agradeço a todos que tenham lido ou que possam ajudar.

Atenciosamente,

Eric.

* No exemplo do registro que eu coloquei, o espaçamento ficou omitido. Entre alguns campos, o arquivo insere vários espaços em branco até completar o espaçamento para o próximo campo. Como no número de telefone... são 20 caracteres. Se o número discado tiver apenas 10 dígitos, são acrescentados mais 10 espaços em branco.


  


2. MELHOR RESPOSTA

Adriano Moreira da Silva
adri3d

(usa Arch Linux)

Enviado em 09/11/2011 - 20:23h

pelo que entendi os campos vão estar sempre na mesma posição
então acho que da para resolver assim:



#!/bin/bash
#autor: Adriano Moreira, novembro 2011

#esse if é para abortar caso não passe por parametro um arquio para converter
if [ -f $1 ]; then
echo "Iniciando converção de $1"
else
echo "arquivo não especificado"
echo "user assim $0 [<arquivo a converter>]"
exit 1
fi


arquivoOriginal=$1 #arquivo é o primeiro parametro
arquivoNovo=$arquivoOriginal'.convertido'

echo -n "" > "$arquivoNovo" #cria ou apaga o conteudo do arquivo de destino caso exista

#esse while vare todo o arquivo linha por linha
#mas cuidado ele não lera a ultima linha se esta não
#possui um retorno(enter \n)
while read linha
do
echo "convertendo a linha: $linha"

#pegando as subStrings
data=${linha:0:7} #
hora=${linha:9:5} #primeiro valor é posição e o segudo comprimento

###monte aqui a nova linha do jeito que quiser
#cada \t é uma tabulação
#o \n no final é o retorno de carro
printf "\t$data\t\t$hora\n" >> $arquivoNovo

done < $arquivoOriginal


to aprendendo shell agora não sei usar sed awk cut

3. Re: Formatação/Estrutura de Arquivo - O Que Usar? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/11/2011 - 18:39h

Se espaço for seu delimitador de campos

Passo 1: retire os espaços extras
Passo 2: substitua os espaços por tabulações

Esse <I> o que significa.




4. Re: Formatação/Estrutura de Arquivo - O Que Usar? [RESOLVIDO]

Eric Guimarães de Sousa Silva
lowbit

(usa Arch Linux)

Enviado em 09/11/2011 - 18:57h

./.ronin escreveu:

Se espaço for seu delimitador de campos

Passo 1: retire os espaços extras
Passo 2: substitua os espaços por tabulações

Esse <I> o que significa.


O <I> antes de um número telefônico indica que foi uma ligação recebida (incoming); sem o <I>, o número é uma ligação de saída. Mas na base de dados o número vai ser guardado com ou sem o <I>, como varchar, já que no arquivo gerado pela serial do PABX, o número só pode ter no máximo 20 dígitos. Se for teclado mais que isso, o resto é ignorado.

Consigo retirar os espaços extras com o sed? A substituição eu creio que seja mais simples, né?

Att,

Eric


5. Re: Formatação/Estrutura de Arquivo - O Que Usar? [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 09/11/2011 - 19:27h

Testa esse ae...


# retira os espaços em branco extras, caso existam e troca espaços por tabulações
# para ser usado em SGDB como o MySQL
sed 's/ \{2,10\}/ /g;s/ /\t/g' entrada.txt >>saida.txt



6. Funcionou

Eric Guimarães de Sousa Silva
lowbit

(usa Arch Linux)

Enviado em 10/11/2011 - 16:32h

./.ronin escreveu:

Testa esse ae...


# retira os espaços em branco extras, caso existam e troca espaços por tabulações
# para ser usado em SGDB como o MySQL
sed 's/ \{2,10\}/ /g;s/ /\t/g' entrada.txt >>saida.txt


Olá, ronin.

Testei o seu código e realmente funcionou. Os espaços em branco viraram tabs.

Preciso estudar o sed. Ele parece fazer muitas coisas úteis. Mas também parece bem complicado, rs.

Muito obrigado pela resposta! ^^


7. Funcionou²

Eric Guimarães de Sousa Silva
lowbit

(usa Arch Linux)

Enviado em 10/11/2011 - 16:41h

adri3d escreveu:

pelo que entendi os campos vão estar sempre na mesma posição
então acho que da para resolver assim:



#!/bin/bash
#autor: Adriano Moreira, novembro 2011

#esse if é para abortar caso não passe por parametro um arquio para converter
if [ -f $1 ]; then
echo "Iniciando converção de $1"
else
echo "arquivo não especificado"
echo "user assim $0 [<arquivo a converter>]"
exit 1
fi


arquivoOriginal=$1 #arquivo é o primeiro parametro
arquivoNovo=$arquivoOriginal'.convertido'

echo -n "" > "$arquivoNovo" #cria ou apaga o conteudo do arquivo de destino caso exista

#esse while vare todo o arquivo linha por linha
#mas cuidado ele não lera a ultima linha se esta não
#possui um retorno(enter \n)
while read linha
do
echo "convertendo a linha: $linha"

#pegando as subStrings
data=${linha:0:7} #
hora=${linha:9:5} #primeiro valor é posição e o segudo comprimento

###monte aqui a nova linha do jeito que quiser
#cada \t é uma tabulação
#o \n no final é o retorno de carro
printf "\t$data\t\t$hora\n" >> $arquivoNovo

done < $arquivoOriginal


to aprendendo shell agora não sei usar sed awk cut


Olá, adri3d.

Copiei o seu código e também funcionou. Especificamente para o que eu preciso fazer, esta solução é mais interessante por eu poder escolher quando campos usar e quais pular. Não uso todas as informações do arquivo no banco de dados.

Alterei algumas coisas pra entender melhor o código e o arquivo foi editado certinho. Segue:


#!/bin/bash
#Script original por: Adriano Moreira (adri3d/vivaolinux)
#Adaptação: Eric G. S. Silva
#Data: 10/11/2011

fileInput=$1
fileOutput='mod.'$fileInput

#Varrer todo o arquivo linha por linha
#Não lerá a útlima linha se esta não possuir um returno (\n)
while read linha
do
#variavel=$linha:posicao:comprimento
data=${linha:0:8}
hora=${linha:9:5}
ramal=${linha:18:3}
destino=${linha:25:20}
duracao=${linha:46:8}

#Montagem da linha do arquivo
printf "$data\t$hora\t$ramal\t$destino\t$duracao\n" >> $fileOutput
done < $fileInput


Muito obrigado.

Ainda vou precisar usar o sed para algumas coisinhas no arquivo, como adicionar um \r no final do arquivo por garantia, e arrumar certinho o formato da data e hora.

A idéia final mesmo é fazer mais dois scripts (um para capturar em texto a serial do pabx e ir jogando em .txts, e outro para importar tudo no mysql de tempos em tempos) e criar um serviço para não me preocupar com isso.

A aplicação em php já está quase terminada. Quando estiver funcional eu posto o resultado aqui.

Abraço!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts