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: (DT_STR, «length», «code_page»)
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
Referências
Data Flow Task: http://msdn.microsoft.com/en-us/library/ms141122.aspx
Flat File Source: http://msdn.microsoft.com/en-us/library/ms139941.aspx
Integration Services: http://msdn.microsoft.com/en-us/library/ms141026.aspx
Transformações SSiS: http://msdn.microsoft.com/en-us/library/ms141713.aspx
Operadores SSiS: http://msdn.microsoft.com/en-us/library/ms137538.aspx
Funções SSiS: http://msdn.microsoft.com/en-us/library/ms141671.aspx
Comentários
Postar um comentário