Lendo conteúdo de arquivo PDF para o SQL Server com Integration Services (Parte 3)


Olá pessoal, continuando...


     No ultimo post, falei como fazer a conexão direta com o arquivo TXT via componente Flat File Source e adicionei um componente Derived Column, um Conditional Split e um OLE DB Destination ao projeto dentro do Data Flow.

Deixe-me explicar o que cada um deles faz:
* Derived Column: cria novos valores de coluna aplicando expressões às colunas de entrada de transformação. Uma expressão pode conter qualquer combinação de variáveis, funções, operadores e colunas da entrada de transformação.

     No caso que estou tratando, vou usar o Derived Column para separar os dados da única coluna de entrada que o Flat File Source me fornece e transformá-los em colunas distintas, usando funções internas do Derived Column como: SUBSTRING, FINDSTRING, ISNULL e o operador «boolean_expression»? «when_true» : «when_false» que funciona o comando IF muito usado em programação.
     Faço da seguinte forma: o SUBSTRING é para separar a cadeia de caracteres em varias cadeias de caracteres, o FINDSTRING é para localizar o ponto onde quero separar as cadeias de caracteres, uso o ISNULL com o operador «boolean_expression» ? «when_true» : «when_false» para verificar se o valor que vou tratar é nulo.

Segue abaixo como é o Derived Column.


     No painel superior esquerdo, posso escolher entre as colunas com os valores a serem tratados ou variáveis, no meu caso, não utilizei nenhuma variável.
No painel superior direito, posso escolher entre as várias funções para tratar strings, datas, valores nulos, operadores e conversão de tipos de dados.
      No painel central é onde acontece todo o tratamento, o mesmo lembra um pouco o Access quando tem que fazer algum tratamento em alguma coluna. Em Derived Column Name é onde dá-se o nome para a nova coluna, em Derived Column, posso fazer uma substituição de uma coluna já existente pela que está sendo criada, em Expression é onde acontece a mágica, todo o tratamento acontece nesse ponto.
     Uso o SUBSTRING em conjunto com o FINDSTRING para separar as cadeias de caracteres que quero. Em Data Type aparece o tipo de dado que vou armazenar e em Lenght aparece o tamanho dele, Precision e Scale são valores automáticos definidos quando são usados inteiros e o Code Page também é automático, ele é definido em Expression.


Para cada campo que eu pretendo criar, usei o SUBSTRING e FINDSTRNG combinados de formas diferentes.


Observem acima, que padrão pode ser encontrado nos dados?
Vamos lá,

5,
4,
3,
2,
1,

Bom, já deu tempo de pensar...

     Todos estão separados por um espaço, tudo bem, isso não ajuda muito, porque o nome das pessoas tem vários espaços entre nome e vários sobrenomes, mas observem as datas, sempre no mesmo padrão, então podemos utilizar a barra como um separador também.
     As duas primeiras linhas dos dados eu ignoro logo no componente Flat File Source na opção Preview, porque não vou precisar delas, pois as colunas das tabelas já vão conter os devidos nomes e não preciso de uma linha vazia.


 Em Data rows to skip, marquei 2, isso ignora as duas primeiras linhas, mas podem ser quantas desejar.

Depois volto ao Derived Column.

Para pegar o código deve-se observar o padrão que o mesmo está, vejam que ele sempre está separado um espaço do nome, então uso isso como critério.

Função: SUBSTRING( «character_expression», «start», «length» )
Função: FINDSTRING( «character_expression», «string», «occurrence» )
Expressão: SUBSTRING(coluna,1,FINDSTRING(coluna," ",1))

     Para o nome, além de usar as formulas acima, também usei uma conversão de dados envolvendo toda a minha expressão, pois quero que seja passado um resultado em forma de String. Usei a função ISNULL e o operador «boolean_expression» ? «when_true» : «when_false» para me certificar que não iria tratar um valor nulo.

Função: ISNULL( «expression» )
Função: SUBSTRING( «character_expression», «start», «length» )
Função: FINDSTRING( «character_expression», «string», «occurrence» )
Operador: «boolean_expression» ? «when_true» : «when_false»
Expressão: (DT_STR,150,1252)(FINDSTRING(coluna,"/",1) > 0 ? SUBSTRING(coluna,FINDSTRING(coluna," ",1) + 1,(FINDSTRING(coluna,"/",1) - (FINDSTRING(coluna," ",1) + 1)) - 2) : "")

Com isso obtive o nome sem pegar dados desnecessários.

     Para as colunas Data e Situação usei as mesmas funções acima, apenas coloquei um adendo em situação, pois usei a função LEN(«character_expression») para pegar o total de caracteres Da cadeia original. Assim, obtive todos os dados que precisava.


     Acima, vejam que usei outro recurso do SSiS para visualizar os dados que tratei antes de finalizar a tarefa, o Data Viewer, clicando na linha verde abaixo do componente, o mesmo pode ser selecionado. Mas vejam que ainda tenho linhas com valores nulos, isso vou tratar com outro componente, o Conditional Split, mas isso será no próximo post.










Referências

Comentários