Script shell para gerar script SQL de INSERT a partir de um arquivo texto

O shell do Linux, sem dúvida é um ótimo ambiente para se trabalhar com fluxos de texto, pois dispõe de uma ampla variedade de programas para manipular arquivos de texto.

Ele pode ajudar quando temos que lidar com grandes volumes de informações em arquivos texto. Um exemplo pode ser a criação de scripts SQL para inserir uma grande quantidade de informações em uma base de dados a partir de um arquivo texto que contenha estes dados.

Facilmente podemos criar um script shell capaz de ler o conteúdo de um arquivo texto e criar scripts SQL de INSERT destas informações para inserir em um banco de dados.

Para mostrar como fazer vamos criar uma oportunidade:

A hipótese

  • Há um arquivo texto chamado CLIENTES.TXT que contém o código e nome do cliente, no qual precisamos inserir os clientes deste arquivo em uma tabela do banco de dados chamada TAB_CLIENTE.
  • A TAB_CLIENTE tem apenas três campos, sendo eles: COD_CLIENTE, DES_CLIENTE e VAL_LIMITE_CREDITO.
  • O campo do limite deve ser igual a “45.00”, independente do cliente.
  • Exemplo de conteúdo do arquivo CLIENTES.TXT:
  • 9999337665277;JOSE DA SILVA
    9999549280275;JOAO SILVEIRA
    9999745441708;MARIA DA LUZ
    9999200854463;BENTA GERTRUDES
    9999659208107;PEDRO DE SOUZA
    9999948839890;BENTO GONCALVES
    9999847556034;LEANDRO DE MATOS
    

O que o script shell precisa fazer?

    Basicamente é necessário carregar cada linha do arquivo em uma variável, extrair as informações do código e nome do cliente, montar o script SQL e criar um arquivo com os scripts SQL gerados.

Como fazer?

    Defina o script para inserir um cliente na base de dados manualmente, exemplo:

    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999337665277, 'JOSE DA SILVA' );
    

    Analise o script SQL e observe que queremos gerar um arquivo texto contendo um script SQL como este por linha.
    Para cada uma das linhas devemos substituir o código e o nome do cliente por aqueles do arquivo texto de clientes.

    A construção do script shell deve iniciar pela criação de variáveis na qual armazenaremos trechos do script SQL para que possamos inserir o código e nome do cliente na posição correta.

    Serão definidas três variáveis:

    • sql0: Armazena o conteúdo do script SQL até o local onde devemos inserir o código do cliente.
    • INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 
      
    • sql1: Armazena o conteúdo entre o código e nome do cliente, ou seja, apenas a vírgula e a aspa.
    • , '
      
    • sql2: Armazena o final do script SQL.
    • ' );
      

    Atribua estes valores nas variáveis sql0, sql1 e sql2 no shell script:

    sql0="INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, "
    sql1=", '"
    sql2="' );"
    

    Para ler linha a linha do arquivo texto de clientes podemos usar o comando while.
    O exemplo abaixo armazena na variável linha cada uma das linhas do arquivo CLIENTES.TXT e exibe na tela o conteúdo lido através do comando echo:

    while read linha; do
       echo "$linha";
    done < CLIENTES.TXT 
    

    Vamos separar da variável linha o campo código do cliente do campo nome do cliente com a expansão de variáveis no shell afim de capturar trechos da variável linha:

    • No exemplo que segue a variável coluna1 recebe o conteúdo da variável linha a partir da posição N até a quantidade de caracteres de tamanho.
    • coluna1=${linha:N:tamanho} 
      

    Para entender melhor podemos modificar o script while fazendo com que seja exibido apenas o nome do cliente na tela, capturando os 50 caracteres a partir da coluna 14.

    Observe o código abaixo:

    while read linha; do
       echo "${linha:14:50}";
    done < CLIENTES.TXT
    

    Modificaremos o trecho do while de tal forma que possamos em conjunto das variáveis sql0, sql1 e sql2 montar o script SQL e exibir na tela:

    while read linha; do
       echo "$sql0${linha:0:13}$sql1${linha:14:50}$sql2"
    done < CLIENTES.TXT 
    

    Para salvar em um arquivo texto, redirecione a saída padrão para um arquivo, observe o exemplo para inserir o resultado no arquivo INSERT_CLIENTES.SQL:

    while read linha; do
       echo "$sql0${linha:0:13}$sql1${linha:14:50}$sql2" >> INSERT_CLIENTES.SQL;
    done < CLIENTES.TXT 
    

Resultado final:

    Ao juntar as partes, devemos ter um script shell assim:

    #!/bin/bash
    # @autor Gabriel Fernandes 
    
    sql0="INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, "
    sql1=", '"
    sql2="' );"
    
    while read linha; do
       echo "$sql0${linha:0:13}$sql1${linha:14:50}$sql2" >> INSERT_CLIENTES.SQL;
    done < CLIENTES.TXT 
    

    Exemplo de conteúdo do arquivo INSERT_CLIENTES.SQL criado:

    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999337665277, 'JOSE DA SILVA' );
    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999549280275, 'JOAO SILVEIRA' );
    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999745441708, 'MARIA DA LUZ' );
    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999200854463, 'BENTA GERTRUDES' );
    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999659208107, 'PEDRO DE SOUZA' );
    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999948839890, 'BENTO GONCALVES' );
    INSERT INTO tab_cliente (val_limite_credito, cod_cliente, des_cliente) VALUES (45.00, 9999847556034, 'LEANDRO DE MATOS' );
    

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s