Pentaho Data Integration com arquivos texto – Parte 1/2

Postado em Atualizado em

Antes de mais nada, gostaria de agradecer ao Fábio de Salles que me ajudou muito nessa tarefa. O Fábio é um grande conhecedor da Suite Pentaho.

Uma situação que enfrentei com o Pentaho Data Integrations(PDI), foi trabalhar com arquivos texto. Pegar arquivos texto e carrega-los em um Banco de Dados.

Só que não foi uma situação comum com arquivos texto. Na maioria das vezes esses arquivos já estão bem formatados, divididos por um separador, seja vírgula, ponto e vírgula ou qualquer outro tipo de separador.

Esse caso em específico, tinha duas particularidades. A primeira é que o arquivo estava todo desformatado, ou seja, o separador eram espaços e existiam colunas que estavam vazias e maioria das informações pegavam mais de uma linha e em geral sem seguir um padrão. A segunda, é que teoricamente a segunda coluna do arquivo (digo teoricamente porque não tinha nenhum padrão de divisão), tinha um tipo. Logo cada um daqueles tipos precisavam ir para tabelas diferentes dentro do banco de dados. Um detalhe, é que esse tipo estava grudado com outra informação dentro do arquivo texto.

Para ilustrar, a solicitação do cliente foi a seguinte:

Preciso que essa fonte de dados que está em arquivo texto, seja transformado em um banco de dados, onde cada tipo será uma tabela. O layout de cada campo, está especificado em um planilha Excel.

Vou colocar o passo a passo de como fiz isso com o Pentaho Data Integration, gravando em um SGDB PostgreSQL. Os dados de exemplo que vou colocar aqui são totalmente fictícios e não condizem com a realidade do cliente. Nesse caso em específico, existiam 15 tipos diferentes, ou seja, surgiram 15 tabelas. Nesse exemplo, vou mostrar com 2 tipos, pois o procedimento se repete.

O arquivo texto que possuí os dados, será referenciado por arquivo_dados.txt. O Formato do arquivo é o seguinte:

017002144301702000011675 0107042010070420104210000000002261060800000000121001001012010SAO PAULO RUA ABC CONSULTOR SEM COMENTARIOS 0000000000000123 05 582500000 ROBERTO JUSTUS 46293043120 000000000000000000000000
0070031145007 9829298000PARQUE IBIRAPUREA

Reparem que não dá para distinguir as informações. Fazendo um Vim numerado no Linux eu consegui pelo menos saber quem eram as linhas, ficou mais ou menos assim:

1 017002144301702000011675 0107042010070420104210000000002261060800000000121001001012010SAO PAULO RUA ABC CONSULTOR SEM COMENTARIOS 0000000000000123 05 582500000 ROBERTO JUSTUS 46293043120 000000000000000000000000
2 0070031145007 9829298000PARQUE IBIRAPUERA

Dá para ver a linha 1 e a linha 2. Lembrando que isso é um pequeno exemplo, o arquivo tinha muito mais linhas.

O primeiro passo era saber onde estava o TIPO que seria usado como filtro para jogar os registros certos para as tabelas certas no banco de dados. Para isso, consultei a planilha.xls, que continha a formatação de cada campo.

Vou colocar um exemplo fictício da planilha, e não vou colocar exemplo de todos os campos, pois ficaria muito grande, já que um dos tipos em questão tem vários campos:

Agora já sabemos onde estão os tipos. Temos 2 tipos, o tipo 01 e o tipo 98. E na planilha podemos ver que temos a posição INICIAL de cada campo, o TAMANHO e o TIPO.

Com o PDI (Pentaho Data Integration), vamos fazer a coisa acontecer.

Em uma nova transformação do PDI, vamos usar um Step chamado Text file input que fica dentro de Input. A imagem dele é a seguinte:

A configuração dele vai ser a seguinte:

Na aba File desse Step, precisamos especificar qual é o arquivo de origem. Procure ele através do botão Browse e com Add eu adiciono ao Selected files. Podem ser especificados vários arquivos.

Na aba Content, o mais importantes são os campos Filetype, onde precisamos deixa-lo com o tipo Fixed, pois o arquivo não é do tipo CSV, logo o Separator não vai ser necessário agora. O outro campo é o Format, que nesse caso pode ser DOS ou Unix e o Encondig, que precisa ter uma atenção especial para não ter problemas na hora de gravar no banco de dados.

A próxima aba, a Fields é onde vamos começar a definir a divisão dos campos dentro do arquivos. Nessa aba, vamos clicar no botão Get Fields, onde o PDI mostrará parte do arquivo, para indicarmos a quebra das colunas. A tela a seguir exemplifica isso:

Como o arquivo está todo bagunçado, a única coluna que realmente conseguimos dividir é a primeira, e ainda sim ela não é um único campo, nos próximos passos, ela será dividida em mais campos. As setas vermelhas foram colocadas manualmente, clicando na posição que deseja fazer a separação.

Nessa caso, podemos dividir o arquivo em 3 colunas, a primeira que está fácil de ser identificada, a segunda que será o nosso campo de filtro que é o TIPO, e o terceiro é o restante do arquivo.

Podemos clicar em Finish e nossa tela ficará da seguinte maneira:

Vejam que os campos foram renomeados para registro_id, tipo e registro_conteudo. Essa nomenclatura não é obrigatória, mas e necessário lembrar delas para os próximos passos.

Com a divisão dos campos, vamos para o segundo passo, que é separar o conteúdo do arquivo por TIPOS. Vamos quebrar o arquivo em tipos e gravar em arquivos separados. Não vamos jogar diretamente para a base de dados, pois eles ainda precisam passar por algumas modificações.

Para dividir o arquivo em outros arquivos, podemos usar o Step chamado Switch/Case que está dentro de Flow. A imagem do Step é a seguinte:

Esse passo depende de outros passos para ser totalmente configurado, pois é ele que vai separar o arquivo conforme o campo que especificarmos e vai jogar para outros Steps.

Para completar essa parte, vamos adicionar dois Steps Text file output que está dentro de Output. A imagem desse passo é a seguinte:

Ligue o Step Text file input ao Switch/Case, e ligue o Switch/Case aos dois Text file output. As ligações ficarão da seguinte forma:

Aqui foi renomeado os nomes dos Steps, para facilitar a visualização. O Step Saida Default, é para gravar linhas que não sejam do Tipo 01 e 98, mas ele não é obrigatório.

Reparem que a ligação do Switch/Case para a Saida do Tipo 01 e 98, está amarela e pontilhada, isso significa que o Switch/Case ainda não está configurado para repassar informações para esses Steps.

Vamos abrir o Switch/Case e configurá-lo:

Nesse Step, tem alguns campos que precisam ser configurados. O primeiro é o Field name to switch. Essa opção define o campo que será usado como separador. Temos que especificar o campo tipo.
O segundo campo é o Case value data type, que define o tipo do campo tipo, que é String.
O terceiro é o Case values. Essa é a opção que vai fazer a separação. Aqui eu digo que tudo que tiver valor 01 nesse campo, seja direcionado para o Step Saida do Tipo 01, e o que tiver valor 98, seja direcionado para o Step Saida do Tipo 98.
E o quarto e não obrigatório é a saida default.

Depois de configurado, as setas ficam da seguinte maneira:

A configuração do Step Saida do Tipo 01 (Text file output), é a seguinte:

Na aba File, é necessário especificar o arquivo onde será gravado os dados que virão do Step anterior.

Na aba Content, é importante informar o Separator, que será “;” e o Format.

Na aba Fields, vamos clicar em Get Fields, para trazer os campos. Nesse momento o campo tipo não é mais importante, pois não precisamos gravá-lo na tabela, já que no banco existirá uma tabela para cada tipo. Logo, podemos remover esse campo da aba Fields, ficando somente o registro_id e registro_conteudo.

Para o Step Saida do tipo 98, é necessário fazer o mesmo procedimento.

Nesse momento, podemos salvar a nossa transformação e executá-la.

Depois da execução da transformação, termos os arquivos saida_tipo_01.txt e saida_tipo_98.txt. Esses arquivos ficarão no seguinte formato.

saida_tipo_01.txt:

017002144301702000011675;07042010070420104210000000002261060800000000121001001012010SAO PAULO RUA ABC CONSULTOR SEM COMENTARIOS 0000000000000123 0558250000 0 ROBERTO JUSTUS 46293043120 000000000000000000000000

saida_tipo_98.txt

0070031145007;29298000PARQUE IBIRAPUERA

Vejam que foi colocado um “;“, separando as duas colunas, e o campo tipo não está mais aqui.

Com isso concluímos a primeira fase que era separar o arquivo pelos seus respectivos tipos, criando um arquivo para cada tipo.

No post com a parte 2 veremos o restante para formatarmos esses campos segundo a planilha.xls e gravar os dados no banco de dados.

Publicidade

10 comentários em “Pentaho Data Integration com arquivos texto – Parte 1/2

    Julio Silva disse:
    18 de abril de 2013 às 13:52

    Muito bom o artigo 1/2 pdi, você chegou publicar a segunda parte (2/2) ?
    Abraços, Julio

      Cesar respondido:
      18 de abril de 2013 às 13:54

      Oi Julio.

      Infelizmente ainda não.

        Daniel Ponciano Lagares disse:
        28 de outubro de 2017 às 15:34

        Boa tarde, Cesar. Vai publicar a parte 2?

        Cesar respondido:
        30 de outubro de 2017 às 8:38

        Bom dia Daniel. Infelizmente não. Já faz um bom tempo esse projeto, e acabei não avançando com ele.

    Eduardo disse:
    22 de abril de 2013 às 14:20

    Muito bom o artigo. Eu consigo carregar dados em Excel para o Pentaho?

      Cesar respondido:
      22 de abril de 2013 às 16:16

      Oi Eduardo.

      Consegue sim. Tem um step chamado Excel Input. Mas só lembrando que a planilha precisa estar gravada como
      .xls e não no formato novo do Excel.

      Abs

    Sérgio Furtado disse:
    10 de outubro de 2016 às 14:17

    Boa tarde, tenho duas tabelas Excel (tab1 e tab2), e tenho campos em comum em ambas, como pegar somente um campo de tab1 e acresentar com os campos de tab2, com Pentaho?

      Cesar respondido:
      11 de outubro de 2016 às 9:48

      Boa Tarde Sérgio.

      De exemplo desses campos e do resultado final que você espera, para eu entender exatamente o que você precisa.

      Obrigado.

    Erick disse:
    1 de agosto de 2017 às 17:06

    Olá, possuo 30 planilhas onde o cabeçalho inicia na linha 6 coluna 2 e possuem apenas um registro. É possível unir todos os registros de cada planilha em uma só e ler o registro a partir da linha 7? Obrigado

    Suzana Oliveira disse:
    29 de dezembro de 2021 às 16:07

    Alguém conseguiu separar as colunas considerando o caractere inicial e o tamanho?

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 )

Foto do Facebook

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

Conectando a %s