MaximoAccess

Caro Usuário, não tire as suas duvidas nas Salas de Repositório, abra sempre um novo tópico relacionado, nas salas destinadas para o efeito, como Sala de Tabelas, Consultas, Formulários, Relatórios, Macros, Módulos e VBA.

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

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3206
    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 ligarFicheiroTXT_a_partir_linha_8.rar

    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

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3206
    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

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3206
    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
    ImportarLogs2003_a_partir_linha_8.rar

    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

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3206
    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

    ahteixeira
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3206
    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: Dom 04 Dez 2016, 14:15