quarta-feira, fevereiro 04, 2009

Problema de quebra de linha em script Shell

O processo:

Gerar um arquivo texto formatado para carga em banco de dados utilizando o SQLLoader do SGBD Oracle. Cada linha desse arquivo deve conter: nome do arquivo, “0”, crc do arquivo, sequência do arquivo e o valor de uma linha de outro arquivo enviado por outro software, ou seja, para cada linha do arquivo enviado deve-se gerar uma nova linha com o formato descrito.

Script gerado:

for arquivo in $DIR_PROC/PCA*.REM ; do
  
 crc=`cksum $arquivo | cut -c1-10`
  
 nomearq=`echo $arquivo | cut -d\/ -f6`
  
 seqarq=`echo $arquivo | cut -d"_" -f2`
   for linha in `cat $arquivo`; do
      echo $nomearq ",0,"$crc","$seqarq","$linha  >> $DIR_PROC/arqPrepCartao.txt
   done
  `cp -f $arquivo $DIR_PROC/lidos_txt/$dia`
done

O problema:

O comando “echo”, utilizado para a criação da linha do novo arquivo, tem como padrão “quebrar” a linha sempre que encontra um espaço em branco na string utilizada. Como o arquivo original é formatado e, obviamente, tem vários espaços inseridos para colocar os valores na coluna esperada, o arquivo destino “arqPrepCartao.txt” fica totalmente desconfigurado. Com isso, a carga no banco de dados tem resultado completamente comprometido.

A solução:

A mais simples que encontrei foi gerar a linha substituindo-se o caractere espaço pelo caractere “#” no comando “cat” da linha do laço – “for” – e retornar com o espaço no lugar de “#” na linha do comando “echo”. Dessa forma o código do script fica assim:

for arquivo in $DIR_PROC/PCA*.REM ; do
  
 crc=`cksum $arquivo | cut -c1-10`
  
 nomearq=`echo $arquivo | cut -d\/ -f6`
  
 seqarq=`echo $arquivo | cut -d"_" -f2`
   for linha in `cat $arquivo | tr ' ' '#'`; do
      echo $nomearq ",0,"$crc","$seqarq","$linha | tr '#' ' '>> $DIR_PROC/arqPrepCartao.txt
  
 done 

  `cp -f $arquivo $DIR_PROC/lidos_txt/$dia`

done

Enquanto não encontrava a solução postei esse problema em uma thread com o título “Line break problem” no fórum do Ubuntu.  Uma das soluções propostas criava a nova linha sem quebras, porém, não mantinha o formato original.

A solução foi compartilhada com a comunidade no fórum.

Nenhum comentário:

Postar um comentário