MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Compartilhe

    caparicio
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9
    Registrado : 04/12/2014

    [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  caparicio em Qui 17 Set 2015, 16:18

    Meus caros, antes de mais muito obrigado por tanto conhecimento partilhado.
    Muita ajuda silenciosa já me deram por aqui :-)

    Agora a minha questão;

    Introdução
    Estou a ajudar uma rádio local a criar relatórios de auxílio à gestão da emissão.
    O software de automação da rádio gera um ficheiro de log por dia cujos nomes são no formato aaaa-mm-dd.txt.

    É possível importar todos os ficheiros .txt para uma única tabela no access  juntando a cada linha importada o nome do ficheiro de origem?

    Usamos o windows 7 e o access 2007.

    Como não estou a conseguir anexar o zip com os ficheiros dexemplo, fica aqui o link onde os podem descarregar para vossa análise, com os exemplos dos ficheiros .log gerados diariamente pelo programa de emissão e com o ficheiro de texto que o próprio prgrama exporta já com tudo junto.

    [Você precisa estar registrado e conectado para ver este link.]

    Será que isto é possível ou estou a delirar demasiado?

    Obrigado desde já e cumprimentos a todos.


    Última edição por caparicio em Qua 23 Set 2015, 20:24, editado 3 vez(es)

    caparicio
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9
    Registrado : 04/12/2014

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  caparicio em Sex 18 Set 2015, 15:20

    Será que alguém consegue ajudar.

    grato desde já
    Cumprimentos

    caparicio
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9
    Registrado : 04/12/2014

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  caparicio em Seg 21 Set 2015, 15:21

    Meus caros,

    com a ajuda do membro deste fórum AHTeixeira, através de um código que este tinha disponibilizado noutro tópico parecido, já consegui automatizar a importação dos ficheiros.
    Agora falta apenas juntar às linhas importadas, o nome do ficheiro, de modo a que cada linha informe de onde ela foi lida.
    Ex.: linha 1 do ficheiro 2015-08-27.txt com o texto "00:15:32 \\musica\portuguesa\paulo de carvalho - E Depois do Adeus.mp3
    Deveria ficar assim na tabela:
    Data             Hora         Musica
    2015-08-27 | 00:15:32 | \\musica\portuguesa\paulo de carvalho - E Depois do Adeus.mp3

    O código disponibilizado pelo AHTeixeira para a importação é o seguinte:

    Option Compare Database
    'requer referencia Microsoft Scripting Runtime
    Dim fso As New FileSystemObject
    Dim fld As folder

    '------------------------------------------------------------
    ' IMPORTAR_BASE_TOTAL
    '
    '------------------------------------------------------------
    Function IMPORTAR_BASE_TOTAL(PastaImportar)

    Dim sFol As String, sFile As String, _
      nDirs As Long, nFiles As Long
      Dim tFld As folder, tFil As File, FileName As String
     
    On Error GoTo IMPORTAR_BASE_TOTAL_Err
     
       sFol = PastaImportar
      sFile = "*.txt"
     
      Set fld = fso.GetFolder(sFol)
      FileName = Dir(fso.BuildPath(fld.Path, sFile), vbNormal Or _
                     vbHidden Or vbSystem Or vbReadOnly)
     
      If Len(FileName) > 0 Then
         
          While Len(FileName) <> 0
       
             nFiles = nFiles + 1
                      MsgBox fso.BuildPath(fld.Path, FileName) 'msg ficheiro, depois pode-se retirar
                      DoCmd.TransferText acImportDelim, "INFORMATIVO BASE TOTAL", "BASE TOTAL", fso.BuildPath(fld.Path, FileName), False, ""
             FileName = Dir()  ' Get next file
                                     DoEvents
          Wend
                       
             MsgBox ("Processados  " & nFiles & "  ficheiro(s).")
         Else
             Call LocalizaArquivos
             Exit Function
         End If

    IMPORTAR_BASE_TOTAL_Exit:
       Exit Function

    IMPORTAR_BASE_TOTAL_Err:
       MsgBox Error$
       Resume IMPORTAR_BASE_TOTAL_Exit

    End Function

    Como adaptá-lo para importar também o nome do arquivo?

    Obrigado desde já pelas sugestões que possam surgir.

    Cumprimentos
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4541
    Registrado : 15/03/2013

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  ahteixeira em Ter 22 Set 2015, 13:28

    Olá Carlos, já tem a parte que faz a pesquisa dos ficheiros.
    Analisando o seu exemplo, na minha opinião tem uma forma fácil.
    Termos que importar a partir da oitava linha de cada ficheiro.

    Fiz um exemplo para um ficheiro, que também liga, terá apenas que fazer:
    a) uma consulta acrescentar do ficheiro ligado para a sua tabela final (pode incluir o nome do ficheiro original nesta consulta)
    b) eliminar a "tabela ligada"
    c) eliminar o ficheiro tmpLog  (kill ...)
    Depois será repetir o mesmo procedimento para cada ficheiro de log.

    Esta é a ideia, segue o código:
    Código:
    'ahteixeira 2015 - maximoaccess
    Dim strLinha As String
    Dim linha As Double

        'ficheiro ler
        Open Application.CurrentProject.Path & "\2015-09-11.log" For Input As #1
        'ficheiro escrever
        Open Application.CurrentProject.Path & "\tmpLog.txt" For Output As #2
        
        Do Until EOF(1)
            linha = linha + 1
            Line Input #1, strLinha
            If linha > 7 Then Print #2, strLinha
        Loop
        
        Close #1
        Close #2

        DoCmd.TransferText _
                TransferType:=acLinkDelim, _
                SpecificationName:="EspecificacoesLigarLog", _
                TableName:="tmp_log", _
                FileName:=Application.CurrentProject.Path & "\tmpLog.txt", _
                HasFieldNames:=False

    O meu teste [Você precisa estar registrado e conectado para ver este link.]

    Nota importante, trabalhe a partir da minha base de dados, foi criado o ficheiro de configurações de importação/ligação EspecificacoesLigarLog

    Abraço

    caparicio
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9
    Registrado : 04/12/2014

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  caparicio em Ter 22 Set 2015, 20:59

    Caro ahteixeira,

    agradeço imensamente a sua boa-vontade, no entanto este código que agora disponibilizou liga um ficheiro à base de dados.
    Como o programa de emissão gera um ficheiro por dia, eu teria que ligar cada um dos novos ficheiros manualmente cada vez que quisesse analisar a emissão.

    O código que me facultou antes deste atende perfeitamente ao que preciso; importa todos os ficheiros de pasta para uma tabela, sejam eles 10, 20 ou 100. É certo que importa todo o "censurado" dos txt como campos em branco e campos com informação irrelevante uma vez que não está a iniciar apenas na linha 8 que é exactamente onde começam os dados que interessam, mas isso eu limpo depois com uma consulta de exclusão.

    A única coisa que falta agora é que, junto com as linhas dos txt, venha também o nome do ficheiro a identificar a linha em exclusivo para aquele dia, já que os ficheiros têm o nome no formato aaaa-mm-dd.txt.

    Estou a fazer testes com um código que encontrei num outro forum e que incluí no que me facultou anteriormente.

    Darei aqui conta de quais forem os resultados.

    Um vez mais muito obrigado pela ajuda e paciência.
    Abraço
    CAparício
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4541
    Registrado : 15/03/2013

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  ahteixeira em Ter 22 Set 2015, 21:33

    Olá Carlos,
    Como já tinha rotina a fazer a leitura dos ficheiros, postei exemplo inacabado.
    Veja:
    Fiz um exemplo para um ficheiro, que também liga, terá apenas que fazer:
    a) uma consulta acrescentar do ficheiro ligado para a sua tabela final (pode incluir o nome do ficheiro original nesta consulta)
    b) eliminar a "tabela ligada"
    c) eliminar o ficheiro tmpLog (kill ...)
    Depois será repetir o mesmo procedimento para cada ficheiro de log.

    Leia melhor.
    Abraço
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4541
    Registrado : 15/03/2013

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  ahteixeira em Ter 22 Set 2015, 22:11

    Olá Carlos Aparicio,

    O procedimento que tinha em mente ficou em Function, aproveitando o exemplo anterior e o que tinha mencionado, veja:
    Código:

    Option Compare Database
    'requer referencia Microsoft Scripting Runtime
    Dim fso As New FileSystemObject
    Dim fld As folder

    '------------------------------------------------------------
    ' IMPORTAR FICHEIROS LOGS
    ' ahteixeira 2015 - maximoaccess
    '------------------------------------------------------------
    Function IMPORTAR_LOGS(PastaImportar)
    'ahteixeira 2015 - maximoaccess
                
    Dim sFol As String, sFile As String, strLinha As String, _
       linha As Double, nDirs As Long, nFiles As Long
       Dim tFld As folder, tFil As File, FileName As String
      
    On Error GoTo IMPORTAR_LOGS_Err

      
        sFol = PastaImportar
       sFile = "*.log"
      
       Set fld = fso.GetFolder(sFol)
       FileName = Dir(fso.BuildPath(fld.Path, sFile), vbNormal Or _
                      vbHidden Or vbSystem Or vbReadOnly)
      
       If Len(FileName) > 0 Then
          
           While Len(FileName) <> 0
        
              nFiles = nFiles + 1
              
                    'ficheiro ler
                    Open fso.BuildPath(fld.Path, FileName) For Input As #1
                    'ficheiro escrever
                    Open fso.BuildPath(fld.Path, "tmpLog.txt") For Output As #2
                    
                    linha = 0
                    
                    Do Until EOF(1)
                        linha = linha + 1
                        Line Input #1, strLinha
                        If linha > 7 Then Print #2, strLinha
                    Loop
                    
                    Close #1
                    Close #2
                    DoEvents
                    
                    'ligar ficheiro
                    DoCmd.TransferText _
                            TransferType:=acLinkDelim, _
                            SpecificationName:="EspecificacoesLigarLog", _
                            TableName:="tmp_log", _
                            FileName:=Application.CurrentProject.Path & "\tmpLog.txt", _
                            HasFieldNames:=False
                    
                    'consulta acrescentar
                    CurrentDb.Execute "INSERT INTO tbl_logs ( logTIME, logACTION, logTEXTO, logFICHEIRO ) SELECT tmp_log.logTIME, tmp_log.logACTION, tmp_log.logTEXTO, '" & FileName & "' FROM tmp_log;"
                    DoEvents
                    'apaga ligação ficheiro
                    DoCmd.DeleteObject acTable, "tmp_log"
                    Kill fso.BuildPath(fld.Path, "tmpLog.txt")
                    
              FileName = Dir()  ' Get next file
              DoEvents
           Wend

              MsgBox ("Processados  " & nFiles & "  ficheiro(s).")
          Else
              MsgBox ("Não foram encontrados ficheiros.")
              Exit Function
          End If


    IMPORTAR_LOGS_Exit:
        Exit Function

    IMPORTAR_LOGS_Err:
        MsgBox Error$
        Resume IMPORTAR_LOGS_Exit

    End Function

    Segue o meu teste, veja se atende
    [Você precisa estar registrado e conectado para ver este link.]

    Abraço


    Última edição por ahteixeira em Qua 23 Set 2015, 09:41, editado 1 vez(es)

    caparicio
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9
    Registrado : 04/12/2014

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  caparicio em Ter 22 Set 2015, 23:20

    Caro ahteixeira,

    Você é o meu heroi!!

    É isto mesmo.

    Funciona na perfeição!

    Não sei como lhe agradecer. Andava há uma semana de volta disto e não estava fácil lá chegar.
    E na verdade não cheguei. Foi o meu amigo que me fez o trabalho todo. E perfeito!

    Eternamente agradecido pelo tempo que dispensou a esta "causa".

    Do que estiver ao meu alcance, por favor, disponha.

    Forte abraço
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4541
    Registrado : 15/03/2013

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  ahteixeira em Qua 23 Set 2015, 09:47

    Olá Carlos Aparicio, obrigado pelo retorno, os utilizadores do fórum agradecem.

    Verifiquei que a partir do 2º ficheiro estava a importar as linhas do cabeçalho, já corrigi, a mensagem nº 7 já foi actualizada, baixe de novo.

    Faltou dar o tópico como resolvido, veja como [Você precisa estar registrado e conectado para ver este link.].
    Abraço.

    caparicio
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 9
    Registrado : 04/12/2014

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  caparicio em Qua 23 Set 2015, 20:21

    Caro AHTeixeira,

    uma vez mais muito obrigado!

    Encerro assim este tópico como resolvido.

    Um abraço
    CAparício
    avatar
    ahteixeira
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4541
    Registrado : 15/03/2013

    Re: [Resolvido]Importar vários ficheiros .txt para uma só tabela adicionando o nome do ficheiro a um campo

    Mensagem  ahteixeira em Qua 23 Set 2015, 20:29

    Olá, obrigado, temos que manter "a casa" limpa, os utilizadores do fórum agradecem.
    Bons estudos com o MaximoAccess Smile
    Abraço

      Data/hora atual: Sex 24 Nov 2017, 01:47