Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thiago Barraviera

Separação de arquivos xml verificando pela tag

Recommended Posts

Olá pessoal.

 

Estou quebrando a cabeça para fazer o seguinte.

 

1 - Tenho uma pasta com muitos vários arquivos xml.

 

2- Esses arquivos seguem um padrão de tags.

 

3- Todos tem uma tag <tpEmis>0</tpEmis> (zero que significa entrada) e <tpEmis>1<tpEmis> (um que significa saida).

 

4- Nesta pasta fica todos os arquivos misturados (Entrada 0 e Saida 1).

 

5- Estou tentando escrever um script em php que possa ler todos os arquivos xml e verificar se na tag <tpEmiss> é 0 ou 1.

 

6- Se for 0(zero) move todos os arquivos com essa tag zero para a pasta ENTRADA, se for 1(um) move os arquivos com tag 1 para pasta SAIDA.

 

 

Como posso começar isso galera? :(

 

Obriga e abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vou ajudá-lo a identificar se um arquivo é de entrada ou de saída, seguinte:

 

$pasta = "caminho/da/pasta/onde/você/colocou/os/arquivos/xml/"; // não esqueça a barra no final

// lista todos os arquivos xml dessa pasta e armazena em um array
$listaArquivosXml = glob($pasta . "*.xml");

// os dois strings que vou procurar para identificar arquivos se entrada/saida
$necessarioEntrada	= "<tpEmis>0</tpEmis>";
$necessarioSaida	= "<tpEmis>1</tpEmis>";

foreach($listaArquivosXml as $arquivoXml) {
    $conteudoXml = file_get_contents($arquivoXml);
    if(strpos($conteudoXml, $necessarioEntrada) !== false) {
	 echo "arquivo {$arquivoXml} é um arquivo de entrada<br />";
        // use fwrite pra escrever o arquivo de entrada no local adequado
    } elseif(strpos($conteudoXml, $necessarioSaida) !== false) {
	 echo "arquivo {$arquivoXml} é um arquivo de saída<br />";
        // use fwrite para escrever o arquivo de SAÍDA no local adequado
    } else {
	echo "O arquivo {$arquivoXml} não é nem entrada nem saída.<br />"; 
    }
}

 

 

Daí só usar as funções de FileSystem para escrever o conteúdo do arquivo em outro lugar dependendo se é "de entrada" ou "de saída".

 

No manual da função fwirte há muitos exemplos de como escrever arquivos, se você não souber.

 

Não sei quantos arquivos são, se forem muitos é bom você alterar max_execution_time e aumentar a memória disponível para o PHP no arquivo php.ini.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza amigo, o script esta identificando certinho o que é entrada e saida.

 

Agora estou tentando utilizar o rename para renomear os arquivos para a pasta correta mais não esta dando certo.

 

Olha meu codigo:

 

<?php

 

$pasta = "todos/"; // não esqueça a barra no final

 

$entrada = "todos/entrada/";

 

$saida = "todos/saida/";

 

$cancelado = "todos/cancelado/";

 

 

 

// lista todos os arquivos xml dessa pasta e armazena em um array

$listaArquivosXml = glob($pasta . "*.xml");

 

// os dois strings que vou procurar para identificar arquivos se entrada/saida

$necessarioEntrada = "<tpEmis>0</tpEmis>";

$necessarioSaida = "<tpEmis>1</tpEmis>";

 

foreach($listaArquivosXml as $arquivoXml) {

$conteudoXml = file_get_contents($arquivoXml);

if(strpos($conteudoXml, $necessarioEntrada) !== false) {

echo "arquivo {$arquivoXml} é um arquivo de entrada<br />";

 

rename($pasta.$arquivoXml, $entrada.$arquivoXml);

 

 

// use fwrite pra escrever o arquivo de entrada no local adequado

} elseif(strpos($conteudoXml, $necessarioSaida) !== false) {

echo "arquivo {$arquivoXml} é um arquivo de saída<br />";

 

 

rename($pasta.$arquivoXml, $saida.$arquivoXml);

 

 

 

// use fwrite para escrever o arquivo de SAÍDA no local adequado

} else {

echo "O arquivo {$arquivoXml} não é nem entrada nem saída.<br />";

 

rename($pasta.$arquivoXml, $cancelado.$arquivoXml);

 

 

 

}

}

 

?>

 

 

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

 

 

 

Bom, vou ajudá-lo a identificar se um arquivo é de entrada ou de saída, seguinte:

 

$pasta = "caminho/da/pasta/onde/você/colocou/os/arquivos/xml/"; // não esqueça a barra no final

// lista todos os arquivos xml dessa pasta e armazena em um array
$listaArquivosXml = glob($pasta . "*.xml");

// os dois strings que vou procurar para identificar arquivos se entrada/saida
$necessarioEntrada	= "<tpEmis>0</tpEmis>";
$necessarioSaida	= "<tpEmis>1</tpEmis>";

foreach($listaArquivosXml as $arquivoXml) {
    $conteudoXml = file_get_contents($arquivoXml);
    if(strpos($conteudoXml, $necessarioEntrada) !== false) {
	 echo "arquivo {$arquivoXml} é um arquivo de entrada<br />";
        // use fwrite pra escrever o arquivo de entrada no local adequado
    } elseif(strpos($conteudoXml, $necessarioSaida) !== false) {
	 echo "arquivo {$arquivoXml} é um arquivo de saída<br />";
        // use fwrite para escrever o arquivo de SAÍDA no local adequado
    } else {
	echo "O arquivo {$arquivoXml} não é nem entrada nem saída.<br />"; 
    }
}

 

 

Daí só usar as funções de FileSystem para escrever o conteúdo do arquivo em outro lugar dependendo se é "de entrada" ou "de saída".

 

No manual da função fwirte há muitos exemplos de como escrever arquivos, se você não souber.

 

Não sei quantos arquivos são, se forem muitos é bom você alterar max_execution_time e aumentar a memória disponível para o PHP no arquivo php.ini.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estou conseguindo fazer mover os arquivos :(

 

 

Esta dando o seguine erro:

 

Warning: rename(/todos/todos/35110303217170000110550010000056561563820318-procNFe.xml,/todos/saida/todos/35110303217170000110550010000056561563820318-procNFe.xml) [function.rename]: No error in C:\xampp\htdocs\mover\index.php on line 32

 

<?php

 

$pasta = "todos/"; // não esqueça a barra no final

 

$entrada = "todos/entrada/";

 

$saida = "todos/saida/";

 

$cancelado = "todos/cancelado/";

 

 

 

// lista todos os arquivos xml dessa pasta e armazena em um array

$listaArquivosXml = glob($pasta . "*.xml");

 

// os dois strings que vou procurar para identificar arquivos se entrada/saida

$necessarioEntrada = "<tpEmis>0</tpEmis>";

$necessarioSaida = "<tpEmis>1</tpEmis>";

 

foreach($listaArquivosXml as $arquivoXml) {

$conteudoXml = file_get_contents($arquivoXml);

if(strpos($conteudoXml, $necessarioEntrada) !== false) {

 

 

rename( "/" . $pasta . $arquivoXml, "/" . $entrada . $arquivoXml );

 

 

// use fwrite pra escrever o arquivo de entrada no local adequado

} elseif(strpos($conteudoXml, $necessarioSaida) !== false) {

 

 

rename( "/" . $pasta . $arquivoXml, "/" . $saida . $arquivoXml );

 

// use fwrite para escrever o arquivo de SAÍDA no local adequado

} else {

 

 

rename( "/" . $pasta . $arquivoXml, "/" . $cancelado . $arquivoXml );

 

 

 

}

}

 

?>

 

 

 

 

 

 

 

Coloque assim:

 


rename( "/" . $pasta . $arquivoXml, "/" . $saida . $arquivoXml );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não consegui descobrir.

O copy tambem não esta funcionando.

 

Warning: copy(/todos/todos/35110303217170000110550010000056391682589970-procNFe.xml) [function.copy]: failed to open stream: No such file or directory in C:\xampp\htdocs\mover\index.php on line 32

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

 

 

<?php

 

$pasta = "todos/"; // não esqueça a barra no final

 

$entrada = "entrada/";

 

$saida = "saida/";

 

$cancelado = "cancelado/";

 

 

 

// lista todos os arquivos xml dessa pasta e armazena em um array

$listaArquivosXml = glob($pasta . "*.xml");

 

// os dois strings que vou procurar para identificar arquivos se entrada/saida

$necessarioEntrada = "<tpEmis>0</tpEmis>";

$necessarioSaida = "<tpEmis>1</tpEmis>";

 

foreach($listaArquivosXml as $arquivoXml) {

$conteudoXml = file_get_contents($arquivoXml);

if(strpos($conteudoXml, $necessarioEntrada) !== false) {

 

 

copy("/" . $pasta.$arquivoXml, "/" . $entrada.$arquivoXml);

 

 

// use fwrite pra escrever o arquivo de entrada no local adequado

} elseif(strpos($conteudoXml, $necessarioSaida) !== false) {

 

 

copy("/" . $pasta.$arquivoXml, "/" . $saida.$arquivoXml);

 

 

 

// use fwrite para escrever o arquivo de SAÍDA no local adequado

} else {

 

 

echo "arquivo {$arquivoXml} é um arquivo de <label style=\"color:#FF0000; font-weight:bold;\">cancelado</label><br />";

 

copy("/" . $pasta.$arquivoXml, "/" . $cancelado.$arquivoXml);

 

}

}

 

?>

 

 

 

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

Coloque assim:

 


rename( "/" . $pasta . $arquivoXml, "/" . $saida . $arquivoXml );

Compartilhar este post


Link para o post
Compartilhar em outros sites

É "/todos/todos/" assim mesmo o caminho? ou "todos" só uma vêz. Tira a variável $pasta do caminho para rename se não for.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu colocar o nome do arquivo ele funciona:

 

elseif(strpos($conteudoXml, $necessarioSaida) !== false) {

 

 

 

// use fwrite para escrever o arquivo de SAÍDA no local adequado

 

echo "arquivo {$arquivoXml} é um arquivo de <label style=\"color:#000000; font-weight:bold;\">Saída</label><br />";

 

 

rename("todos/35110303217170000110550010000056251368635586-procNFe.xml", "saida/35110303217170000110550010000056251368635586-procNFe.xml");

 

}

 

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

Mais se eu colocar a variável não funciona:

 

elseif(strpos($conteudoXml, $necessarioSaida) !== false) {

 

 

 

// use fwrite para escrever o arquivo de SAÍDA no local adequado

 

echo "arquivo {$arquivoXml} é um arquivo de <label style=\"color:#000000; font-weight:bold;\">Saída</label><br />";

 

 

rename("todos/$arquivoXml", "saida/$arquivoXml");

 

}

 

 

Não sei o que estou fazendo de errado.

 

 

 

 

É "/todos/todos/" assim mesmo o caminho? ou "todos" só uma vêz. Tira a variável $pasta do caminho para rename se não for.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então pessoal, ainda não consegui resolver isso.

 

Se eu coloco o nome do arquivo, funciona.

 

rename("todos/35110303217170000110550010000056251368635586-procNFe.xml", "saida/35110303217170000110550010000056251368635586-procNFe.xml");

 

 

Agora se eu colocar a variavel para mover todos os arquivos do array, ele da erro.

 

rename("todos/$arquivoXml", "saida/$arquivoXml");

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.