none
Replace em arquivo exportado com SSIS RRS feed

  • 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

    segunda-feira, 19 de agosto de 2013 18:31

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 Sub

    Pois 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
    segunda-feira, 19 de agosto de 2013 19:52

Todas as Respostas

  • string numeros = "1,2,3,4";
    
    string teste = numeros.Replace(",", "");

    Seria algo assim?
    segunda-feira, 19 de agosto de 2013 18:35
  • Por ae, mas teria que ser feito dentro do SSIS, em meu projeto .dtsx ...

    Pimenta

    segunda-feira, 19 de agosto de 2013 18:37
  • 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


    - :)



    segunda-feira, 19 de agosto de 2013 18:58
  • 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

    segunda-feira, 19 de agosto de 2013 19:07
  • 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). 


    - :)



    segunda-feira, 19 de agosto de 2013 19:41
  • 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 Sub

    Pois 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
    segunda-feira, 19 de agosto de 2013 19:52
  • 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


    - :)


    segunda-feira, 19 de agosto de 2013 19:56