Arquivo de etiquetas: text files

BULK INSERT FILES WITH FIXED Width fields

Olá,
muitas vezes existem processos com necessidade de importação de dados de ficheiros texto para uma tabela SQL.
O BULK INSERT do SQL é uma boa ferramenta para esse efeito. A importação de um ficheiro para o SQL através de código com o BULK INSERT é algo básico; menos básico será a importação de diversos ficheiros, em diferentes pastas, para uma única tabela de SQL numa só importação.

Se a este processo se colocar a dificuldade de formatação dos ficheiros torna-se um processo moroso.

Com este artigo quero mostrar uma forma de importação de diversos ficheiros, em diferentes pastas, num único processo de SQL BULK INSERT, para uma única tabela. Além disso, mostro uma forma de importar os ficheiros de texto com largura de campos fixa, corrigindo problemas de formatação de colunas que poderiam surgir.

Assim, a minha estrutura de pastas e ficheiros é a seguinte:

importfolder

Foi criada uma estrutura com uma pasta mãe denominada “Folder” e no seu interior diversas pastas “01“, “02“, etc.
Dentro de cada uma destas pastas existem ficheiros de texto no seguinte formato:

importfolder2

Queremos juntar os dados dos diferentes ficheiros numa única tabela, mas devidamente separados por colunas de dados.

O script SQL passa por dois momentos:

  1. Cria tabela temporária para popular com o caminho e nome dos ficheiros
  2. Cria tabela temporária onde irá inserir os valores do ficheiros listados anteriormente , ou melhor, irá inserir os valores das colunas previamente criadas, através de um ficheiro de configuração XML, com as respectivas colunas de dados.

O primeiro passo será, então, criar a tabela temporária onde serão listados os ficheiros e respectivos caminhos de acesso aos mesmos. Além disso é criada um índice com intuito de melhor performance :

importfolder3

Agora vamos popular essa tabela:

importfolder4

O resultado final do script anterior leva aos seguintes resultados, para o meu caso específico de pastas e ficheiros:

importfolder5

O ficheiro FileFormat.xml deve ser eliminado desta tabela temporária:

importfolder6

De seguida, vamos criar uma tabela temporária para armazenamento dos resultados finais, isto é, o Merge de todos os registos de todos os ficheiros existentes nas diferentes pastas. A criação de três colunas será explicada mais à frente:

importfolder7_

O processo é idêntico a ter uma pilha (ou fila) de ficheiros que à medida que se insere um deles na tabela é eliminado dessa mesma pilha. Dessa forma, o número de ficheiro na pilha vai diminuindo até chegar a zero, altura que o ciclo termina.

O resultado final da tabela temporária é este:

importfolder8

Repare-se na estrutura de dados fixa que foi criada com três colunas. Foi apenas um exemplo, poderiam ser mais e de diversos tipos.

A formatação das colunas de valor fixo de largura e tipo de dados é configurada através do ficheiro FileFormat.XML listado acima.

O BULK INSERT utiliza o parâmetro de configuração de ficheiro externo (with FormatFile) permitindo a leitura em formato de diferentes campos fixos com consequente inserção no SQL.

O conteúdo do ficheiro de configuração FileFormat.XML é o seguinte:

importfolder9

Poderia ter optado por colocar mais colunas especificando seu tamanho e tipo, conforme fosse solicitado.

Por fim, todo o código poderá ser incluído numa Stored Procedure com o resultado final a ser incluído numa tabela física, procedendo posteriormente à eliminação da tabela temporária.

Espero que vos seja útil,

JG