Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Percorrer diretórios e suas subpastas criando uma tabela com os arquivos

Pessoal boa tarde,

Tenho um diretório em rede com vários subpastas, exemplo:

\\BRITJ\ARQUIVOS

Subpastas:

2012

JAN02J012

JAN032012

.....

OCT31012

Nas subpastas separadas por dia tenho diversos arquivos de diferentes extensões  (*.pdf, *.exe, *.zip, *.rar).

Inicialmente preciso listar em um tabela (in line), todos os arquivos de extensões *.pdf, *.xls, alguémjá precisou de algo parecido, sugere algo?

PS: Preciso montar um script que percora o diretório \\BRITJ\ARQUIVOS\2012 e percorra todas as subpastas, relacionando apenas os arquivos de extensões *.pdf, *.xls conforme abaixo:

ID          Diretorio                                                       Arquivo

01         \\BRITJ\ARQUIVOS\2012\JAN02J012              100.xls

02         \\BRITJ\ARQUIVOS\2012\JAN02J012              100.pdf

03         \\BRITJ\ARQUIVOS\2012\JAN02J012              101.xls

04         \\BRITJ\ARQUIVOS\2012\JAN02J012              101.pdf

Sugestões?

Labels (2)
1 Solution

Accepted Solutions
erichshiino
Partner - Master
Partner - Master

Fiz alguns testes e para mim funcionou depois de tirar uns espaços em branco:

Estava assim:

(Root&' \*' )

Ficou assim:

(Root&'\*' )

Parece que ao jogar o código aqui no forum, surgiram alguns espaços adicionais...

Em qualquer ponto dos loops, pode testar o valor das variáveis com o Trace. Assim:

Trace $(Root);

Trace $(Ext);

Trace $(File);

Talvez, ainda em script, na aba de settings ( configurações) marque o 'Can Execute External Program', mas acho que não seria necessário

Abs,

View solution in original post

9 Replies
erichshiino
Partner - Master
Partner - Master

Weslley,

Você pode usar este trecho que faz parte do help da estrutura do for each...

Já tem a maior parte do que precisa lá. Precisa ajustar alguns parâmetros:

Coloque a sub e chamada da sub no script.

Ajuste o diretório inicial na última linha ( call dodir('\\BRITJ\ARQUIVOS' ))  e acerte as extensões que precisa:


SUB DoDir (Root)

FOR Each Ext in 'qvw', 'qva', 'qvo', 'qvs'

FOR Each File in filelist (Root&' \*.' &Ext)

LOAD

'$(File)' as Name,

FileSize( '$(File)' ) as Size,

FileTime( '$(File)' ) as FileTime

autogenerate 1;

NEXT File

NEXT Ext

FOR Each Dir in dirlist (Root&' \*' )

call DoDir (Dir)

NEXT Dir

ENDSUB

CALL DoDir ('C:')

Abs,

Erich

Not applicable
Author

Erich boa tarde, obrigado pela dica.....

Tirando com base o que temos na documentação, estou testando o codigo abaixo e a variavel File vem sempre vazia.

Mesmo existindo o arquivo 'C:teste.qvw'

Pode me auxiliar informando no código abaixo o que está errado, não estou identificando.

SUB DoDir (Root)

    FOR Each Ext in 'qvw','qva','qvo','qvs' //     'xls', 'pdf'

   

        FOR Each File in filelist (Root&' \*.'&Ext)

   

            LOAD

                '$(File)' As Nome,

                FileSize('$ (File)') As Tamanho,

                FileTime('$ (File)') As HoraDoArquivo,

                Autogerenate 1;

        NEXT File

       

    NEXT Ext

   

    FOR Each Dir in dirlist (Root&' \*' )

        CALL DoDir (Dir)

    NEXT Dir

   

ENDSUB

CALL DoDir ('C:')

Desde já agradeço

erichshiino
Partner - Master
Partner - Master

Fiz alguns testes e para mim funcionou depois de tirar uns espaços em branco:

Estava assim:

(Root&' \*' )

Ficou assim:

(Root&'\*' )

Parece que ao jogar o código aqui no forum, surgiram alguns espaços adicionais...

Em qualquer ponto dos loops, pode testar o valor das variáveis com o Trace. Assim:

Trace $(Root);

Trace $(Ext);

Trace $(File);

Talvez, ainda em script, na aba de settings ( configurações) marque o 'Can Execute External Program', mas acho que não seria necessário

Abs,

Not applicable
Author

Erich mais uma vez obrigado.

O erro estava ocorrendo devido a espações em brancos.

Agora conisgo listar todos os arquivos em uma subpasta.

Falta apenas criar um laço no diretório  \\BRITJ\ARQUIVOS\2012 e dentro passar subpasta por subpasta alterado a ultima linha do código para:

//call DoDir ('\\BRITJ\ARQUIVOS\2012\'&SUBPASTA')

Code

// Percorre  todos os arquivos parametrizado Ext

sub DoDir (Root)

    for each Ext in 'xls','pdf'

        for each File in filelist (Root&'\*.'&Ext)

            Load

                '$(File)' as Name,

                FileSize('$(File)') as Size,

                FileTime('$(File)') as FileTime

                autogenerate 1;

        next File

    next Ext

    for each Dir in dirlist (Root&'\*')

        call DoDir (Dir)

        next Dir

end sub

call DoDir ('\\BRITJ\ARQUIVOS\2012')

Unquode

Valeu.

erichshiino
Partner - Master
Partner - Master

Weslley,

Este trecho deveria já entrar recursivamente nos subdiretórios ( em múltiplos níveis):

    for each Dir in dirlist (Root&'\*')

        call DoDir (Dir)

        next Dir

Veja se não há outros caracteres estranhos no meio...

Caso fosse apenas um mesmo, poderia chamar o DoDir novamente no final:

call DoDir ('\\BRITJ\ARQUIVOS');

call DoDir ('\\BRITJ\ARQUIVOS\2012')

Abraços

Erich

Not applicable
Author

Erich, mais uma vez ponto para você!

Estava correto eu que não tinha testando ainda no diretorio final, esta tudo ok, esta com laço recursivamente nos subdiretórios.

Um ultima pergunta, preciso saber a quantidade de páginas que tem cada arquivo *.pdf , me sugere algo para fazer isso no  qlikview ?

Em algumas linguagem de programação tem a função GetPageNum que abre o arquivo e verifica quantas páginas tem.

Exemlpo:

GetPageNum(MyPath& Application.PathSeparator & MyFile) ' pg

aderlanrm
Partner - Specialist
Partner - Specialist

Olá Weslley,

Não sei dizer se existe essa função, mas veja a posibilidade de colocar a quantidade de páginas no nome do arquivo e usar a função MID para pegar o valor definido, claro que nem sempre é possível fazer isso, principalmente se são arquivos muitos dinâmicos ou tem uma quantidade muito grande.

Veja na ajuda (F1) do QlikView, tem alguma funções para pagar a data que o arquivo foi criado e etc. talvez encontre alguma relacionada ao que está buscando.

Abraço.

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
Not applicable
Author

Aderlan obrigado pela dica, procurei mais não encontrei, provavelmente essa função não tem qlikview.

Terei que recorrer ao antigo excel + vba ....o duro que tenho uma quantidade muito grande de arquivos, e isso demora muito.

Uma pena...

Obrigado pela tentativa....

aderlanrm
Partner - Specialist
Partner - Specialist

Boa noite Weslley,

O QlikView aceita perfeitamente as macros do Excel com pequenas adaptações, veja o editor de módulos, já usou?

Dê uma buscada aqui mesmo na community, vai encontrar bastante códigos legais.

Lembrando que o uso de macros não é rocomendado pela QlikTech.

Abraço.

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)