none
Script VBS para ler XML RRS feed

  • Pergunta

  • Pessoal, seguinte...

    Um hd de um server que continha MILHOES de arquivos XML foi pro "saco" e conseguimos usar um software de recuperacao para recuperar. Ele recuperou 11 milhoes de arquivos XML, porem com nome sequencial  ( de 11111111 à 99999999) ... 

    Sendo assim, nao sei o que cada arquivo contém. 

    Gostaria de saber se alguem pode me ajudar com um script para ler esses 11 milhoes de XML que esta em um diretorio (ex: C:\xml) e ele buscar uma informação especifica dentro do arquivo. No meu caso preciso que uma tag chamada <dEmi> seja encontrada, junto com o ano... um arquivo por exemplo, tem a estrutura assim: <dEmi>2011-12-30</dEmi> 

    Porem, eu preciso filtrar os arquivos do ano de 2014 <dEmi>2014-mm-dd</dEmi> me trazendo dia e mes qq do ano vigente. E eu preciso que ele gere um arquivo (pode ser texto) para ele me falar o NOME dos arquivos xml que contem 2014 entre as tags <dEmi> e </dEmi>

    Aguardo ajuda e ideia de vcs.


    Albert Alberico dos Santos

    quinta-feira, 21 de agosto de 2014 20:06

Respostas

  • Albert,

    Só mais uma coisa, estou usando a versão 3.0 do Powershell.

    PS C:\Users\fabio.junior> host
    
    
    Name             : ConsoleHost
    Version          : 3.0
    InstanceId       : f61a8e45-0f8e-4302-b358-37d69326f517
    UI               : System.Management.Automation.Internal.Host.InternalHostUserI
                       nterface
    CurrentCulture   : pt-BR
    CurrentUICulture : pt-BR
    PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
    IsRunspacePushed : False
    Runspace         : System.Management.Automation.Runspaces.LocalRunspace


    Fábio de Paula Junior

    • Marcado como Resposta Santos Ber segunda-feira, 25 de agosto de 2014 19:43
    segunda-feira, 25 de agosto de 2014 14:10
    Moderador
  • Teste cada um dos 5 comandos, assim:

    Get-ChildItem -Recurse "C:\temp\teste\*.xml"

    O resultado deste tem que trazer uma lista de todos os xml

    -------------

    Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-"

    Este tem que trazer uma lista de todos os arquivos que contém a string "<demi>2014-"

    ------------

    (Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-").Filename | 
    Get-Unique

    Agora ele vai trazer o nome de cadar arquivo mas somente uma vez

    ----------------------

    (Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-").Filename | 
    Get-Unique |
    Set-content -path C:\temp\resultado.txt

    Este último vai gravar o resulta em arquivo.

    Me diz aí onde "deu ruim"


    Fábio de Paula Junior

    • Marcado como Resposta Santos Ber segunda-feira, 25 de agosto de 2014 19:43
    sexta-feira, 22 de agosto de 2014 00:58
    Moderador

Todas as Respostas

  • Se servir um PowerShell

    (Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-").Filename | Get-Unique

    Primeiro tem um agrupamento do Get-Children (lista os arquivos) + Select-String (que localiza a string dentro dos arquivos). Em seguida uso o Get-Unique para não ter registros duplicados porque se você tiver o "<dEmi>2014-" mais de uma vez no arquivo ele seria listado duas vezes pelo select-string.

    Edição:

    Faltor gerar o arquivo.

    (Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-").Filename | 
    Get-Unique |
    Set-content -path C:\temp\resultado.txt
    é uma única linha com os comandos separados por pipe "|"


    Fábio de Paula Junior




    quinta-feira, 21 de agosto de 2014 20:29
    Moderador
  • Cara, ate serve se atender a minha necessidade...rs...

    Executei os comandos e ele gerou o resultados.txt vazio. Eu me certifiquei a nivel de testes que havia arquivos que contem a string <dEmi>2014 

    Alguma sugestao do que pode estar ocorrendo?


    Albert Alberico dos Santos

    quinta-feira, 21 de agosto de 2014 21:13
  • Teste cada um dos 5 comandos, assim:

    Get-ChildItem -Recurse "C:\temp\teste\*.xml"

    O resultado deste tem que trazer uma lista de todos os xml

    -------------

    Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-"

    Este tem que trazer uma lista de todos os arquivos que contém a string "<demi>2014-"

    ------------

    (Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-").Filename | 
    Get-Unique

    Agora ele vai trazer o nome de cadar arquivo mas somente uma vez

    ----------------------

    (Get-ChildItem -Recurse "C:\temp\teste\*.xml" | Select-String "<dEmi>2014-").Filename | 
    Get-Unique |
    Set-content -path C:\temp\resultado.txt

    Este último vai gravar o resulta em arquivo.

    Me diz aí onde "deu ruim"


    Fábio de Paula Junior

    • Marcado como Resposta Santos Ber segunda-feira, 25 de agosto de 2014 19:43
    sexta-feira, 22 de agosto de 2014 00:58
    Moderador
  • Então, ao executar o primeiro comando, ele me lista todos os arquivos XML.

    Ao executar o segundo ele me traz os arquivos que contem a string que eu quero, mas sai uma desordem só, vem o conteudo do xml impresso na tela, e nao o NOME DOS ARQUIVOS que contem aquela string.

    O Terceiro, nao faz nada... e o quarto, nem testei pq ele nao executou o terceiro.


    Albert Alberico dos Santos

    sexta-feira, 22 de agosto de 2014 12:34
  • Albert,

    Eu já havia colocado um detalhe no código mas não expliquei, o ".filename", senão acontece de sair os dados do xml junto com o nome do arquivo.

    Veja um exemplo que fiz, criei três arquivos que contém várias entradas com o "2014"(2 em cada arquivo) e mais um sem entrada, veja como foi a execução



    Fábio de Paula Junior

    sexta-feira, 22 de agosto de 2014 13:58
    Moderador
  • Cara, se no meu caso o resultado fosse esse eu matava meu problema... mas executei no meu Win2k8 server e no meu Win7 e ambos nao trouxeram os resultados. Segue imagem.


    Albert Alberico dos Santos

    sexta-feira, 22 de agosto de 2014 16:54
  • Se tiver condição cole aqui um treco do seu xml, com umas 3 linhas acima e abaixo da parte onde está o texto que você quer localizar.

    Fábio de Paula Junior

    sexta-feira, 22 de agosto de 2014 17:16
    Moderador
  • Segue abaixo:

    <?xml version="1.0" encoding="UTF-8"?>

    -<enviNFe versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe">

    <idLote>xxxxxxxxxxxxxxxxxxxxx</idLote>


    -<NFe xmlns="http://www.portalfiscal.inf.br/nfe">


    -<infNFe versao="2.00" Id="NFe29130907205440000558550050000039601000000000">


    -<ide>

    <cUF>29</cUF>

    <cNF>00000000</cNF>

    <natOp>REMESSA PARA DEPOSITO FECHADO OU ARMAZEM GERAL</natOp>

    <indPag>0</indPag>

    <mod>55</mod>

    <serie>5</serie>

    <nNF>3960</nNF>

    <dEmi>2013-09-28</dEmi>

    <tpNF>1</tpNF>

    <cMunFG>2909307</cMunFG>

    <tpImp>1</tpImp>

    <tpEmis>1</tpEmis>

    <cDV>0</cDV>

    <tpAmb>1</tpAmb>

    <finNFe>1</finNFe>

    <procEmi>0</procEmi>

    <verProc>5.6.3.30918</verProc>

    </ide>


    -<emit>

    <CNPJ>00000000000000000000000</CNPJ>

    <xNome>EMPRESA S/A</xNome>


    Albert Alberico dos Santos

    sexta-feira, 22 de agosto de 2014 18:41
  • Colei o texto dentro do 002.xml.


    Fábio de Paula Junior

    sexta-feira, 22 de agosto de 2014 18:55
    Moderador
  • Albert,

    Só mais uma coisa, estou usando a versão 3.0 do Powershell.

    PS C:\Users\fabio.junior> host
    
    
    Name             : ConsoleHost
    Version          : 3.0
    InstanceId       : f61a8e45-0f8e-4302-b358-37d69326f517
    UI               : System.Management.Automation.Internal.Host.InternalHostUserI
                       nterface
    CurrentCulture   : pt-BR
    CurrentUICulture : pt-BR
    PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
    IsRunspacePushed : False
    Runspace         : System.Management.Automation.Runspaces.LocalRunspace


    Fábio de Paula Junior

    • Marcado como Resposta Santos Ber segunda-feira, 25 de agosto de 2014 19:43
    segunda-feira, 25 de agosto de 2014 14:10
    Moderador
  • Fabio, funcionou o script que me passou na versao 3.0!

    me ajudou MUITO mas surgiu uma nova necessidade em cima desse mesmo trabalho.... ve se ainda pode me ajudar...

    No caso, estamos procurando por UMA unica string... e seu eu quisesse por exemplo procurar ALEM DO ANO, o CNPJ X ?

    Ou seja, tenho o CNPJ X que esta na string "<cnpj>123123123123001</cnpj>" e tem o "<demi>2013-" . Se o arquivo atender a essas DUAS condições, ele me retorna o nome do arquivo.

    Aguardo seu retorno ansioso!


    Albert Alberico dos Santos


    • Editado Santos Ber segunda-feira, 25 de agosto de 2014 21:24 Mais informacoes
    segunda-feira, 25 de agosto de 2014 21:22
  • Albert,

    Tente o parametro -patern do select-string

    (gci C:\temp\teste\*.xml | Select-String -Pattern '(<cnpj>123123123123001</cnpj>.*<demi>2013-)|(<demi>2013-.*<cnpj>123123123123001</cnpj>)').Filename

    Neste exemplo não importa se o <cnpj> vem antes ou depois do <demi>, mas se vc tiver certeza que o cnpj sempre vem antes do demi então você pode simplificar a expressão, assim:

    (gci C:\temp\teste\*.txt | Select-String -Pattern '(<cnpj>123123123123001</cnpj>.*<demi>2013-)').Filename


    Fábio de Paula Junior

    terça-feira, 26 de agosto de 2014 03:24
    Moderador