Usuário com melhor resposta
Replace em arquivo exportado com SSIS

Pergunta
-
Boa tarde, quando gero um aquivo txt, ele delimita as colunas com uma "," (vírgula), gostaria de saber se tem como eu dar um REPLACE depois do arquivo gerado, ou gerar sem essa vírgula, por exemplo :
1,2,3,4
ficando ...
1234
Grato !
Pimenta
Respostas
-
Certo, consegui fazendo da seguinte forma, no Control Flow, criei um Script Task, que é executado depois do Data Flow, ou seja, depois que ele gerou o arquivo, sendo assim, dentro do Script eu criei a função do replace :
Public Sub Main()
removeVirgula()
Dts.TaskResult = Dts.Results.Success
End Sub
Public Sub removeVirgula()
Dim file As New System.IO.StreamReader("c:\Backup20130819.txt")
Dim data As String
data = file.ReadToEnd().Replace(",", "")
file.Close()
Dim writer As New System.IO.StreamWriter("c:\Backup20130819.txt", False)
writer.Write(data)
writer.Flush()
writer.Close()
End SubPois teria que ser de uma forma automática, pronto para ser exportado diariamente e importado por outra ferramenta no layout requirido. Mesmo assim muito obrigado pela ajuda !
Pimenta
- Sugerido como Resposta Renato Siqueira segunda-feira, 19 de agosto de 2013 19:56
- Marcado como Resposta Alysson Queiroz quinta-feira, 22 de agosto de 2013 20:28
Todas as Respostas
-
-
-
Boa tarde Luis,
Não entendi muito bem... Por qual motivo você deseja retirar a vírgula?
Sem um delimitador entre as colunas, a tarefa de manipular os dados pode ser extremamente trabalhosa e na maioria das vezes inviável....
A opção column Delimiter (dentro da conexão do Flat File, na aba Columns) possui algumas alternativas para uso de delimitação, como Ponto e vírgula, dois pontos... Se a vírgula pode te trazer problemas, por exemplo, em importações de txt pra excel (isso é até comum), basta alterar o delimitador.
Agora, se você pretende tirar as vírgulas dos registros (não sei se essa é sua dúvida, por favor, me corrija se estiver errado,mas não custa perguntar), o assunto seria tratamento de dados (Transformation) e aí você pode usar a função REPLACE tanto via T-SQL (usando componentes que dêem suporte, como SQL Command se disponível no seu componente de tratamento) ou usando componentes , dentro do DATA FLOW, que pertencem à categoria Data Flow Transformations, como por exemplo o Derived Column, que permite o uso de algumas expressões comuns à bibilioteca .net, inclusive REPLACE (Na pasta String Functions).
Espero que não tenha ficado confuso e que possa ter te ajudado.
[]'s
- :)
- Editado Renato Siqueira segunda-feira, 19 de agosto de 2013 19:03
-
Seria exatamente o que você me falou, mas não entendi como fazer, para resumir vou dar um exemplo :
Eu exporto o arquivo de minha tabela com 4 registro chamado file.txt e dentro dele fica da seguinte forma :
1,2,3,4
5,6,7,8
9,1,2,3
4,5,6,7
Dessa forma, cada linha possui o delimitador "," para separar as colunas, sendo assim eu precisava que exportasse o arquivo sem a ",", ficando
1234
5678
9123
4567
No meu projeto tenho apenas o Source Query, que faz a consulta no banco e o DestinationConnectionFlatFile, que salva o arquivo.txt, eu usaria o cara do Derived Column depois do arquivo gerado ou antes ? ( Sou novato em SSIS ) .
Obrigado !
Pimenta
-
Luis, acho que entendi a sua dúvida.
Você disse que está mexendo com SSIS. Só pra confirmar, você está trabalhando no seu .dtsx usando o Import and Export do SQL Server ou usando o BIDS (Business Intelligence Development Studio)? Pela menção do "Source Query", acredito ser o I&E. No caso, esquece aquilo que falei sobre Derived Columns, etc...
Quero confirmar de novo...
Quando você diz que seu .txt retorna o resultado:
1,2,3,4
Você afirma que cada número desse é o registro de uma coluna, certo?
Neste caso, tente colocar no Query Source adaptando com o nome de suas colunas e tabela:
SELECT COLUNA1+COLUNA2+COLUNA3+COLUNA4 AS COLUNA1 FROM TB_WHATEVER
O que isso vai fazer? Ora, tudo vai pra uma linha só e aí você não terá vírgula delimitando o campo porque só teria uma coluna. É meio que uma gambiarra, então, veja se realmente será necessário agir desta forma.
Estou levando em conta que todos os campos são do tipo "textuais". Se for númerico ou outro tipo, você vai precisar usar no Query Source uns CASTs e CONVERTs pra deixar todos do mesmo tipo, de modo que possam ser concatenados. Se estiver usando SQL Server 2012 ou superior, use a função CONCAT.
Observação
É obrigatório que as colunas sejam delimitadas por algum caracter, que por default, é a vírgula. Você pode trocar no Column Delimiter na exportação para outro caracter, como o pipe. Novamente, qual seria a necessidade de importar esse arquivo sem delimitador algum entre as colunas?
Se for algo trivial, você pode simplesmente abrir o .txt, usar um CTRL+H (Replace), e pedir pra trocar a vírgula por vazio (mas avalie se isso é possível e desejável).
- :)
- Editado Renato Siqueira segunda-feira, 19 de agosto de 2013 19:44
-
Certo, consegui fazendo da seguinte forma, no Control Flow, criei um Script Task, que é executado depois do Data Flow, ou seja, depois que ele gerou o arquivo, sendo assim, dentro do Script eu criei a função do replace :
Public Sub Main()
removeVirgula()
Dts.TaskResult = Dts.Results.Success
End Sub
Public Sub removeVirgula()
Dim file As New System.IO.StreamReader("c:\Backup20130819.txt")
Dim data As String
data = file.ReadToEnd().Replace(",", "")
file.Close()
Dim writer As New System.IO.StreamWriter("c:\Backup20130819.txt", False)
writer.Write(data)
writer.Flush()
writer.Close()
End SubPois teria que ser de uma forma automática, pronto para ser exportado diariamente e importado por outra ferramenta no layout requirido. Mesmo assim muito obrigado pela ajuda !
Pimenta
- Sugerido como Resposta Renato Siqueira segunda-feira, 19 de agosto de 2013 19:56
- Marcado como Resposta Alysson Queiroz quinta-feira, 22 de agosto de 2013 20:28
-
Ah sim...
Que bom que conseguiu resolver o seu problema!
No final das contas sua dúvida era simples e eu compliquei por não ter entendido a finalidade.
Peço desculpas.
[]'s
- :)
- Editado Renato Siqueira segunda-feira, 19 de agosto de 2013 20:07