Fazer um parser em arquivos zipados
Olá galera, como vocês estão?
Sou estagiário em programação web, tenho apenas 6 meses de experiencia em php, no meu estágio, estamos fazendo um trabalho de monitoramento de rede, usando um software, Fiddler, ele me gera um zip, dentro dele tem vários arquivos que são gerados pelo programa com dados estatísticos da rede. Resumindo tudo isso, ele gera três tipos de arquivos, .txt, .xml, *.htm.
Para trabalhar com eles criei scripts, que abrem o zip e leia o conteúdo dos arquivos e mandem para um banco de dados, desses três já consegui dois, txt e xml, estou preso no htm, o código padrão que uso para abrir os zips e tratar os arquivos:
<?php
if (!extension_loaded('zip'))
{
echo ("Seu arquivo php.ini não está habilitado para esta função!");
}
$dir_origem = 'C:\Users\vinicius.psilva\Documents\Fiddler2\Captures';
//$arquivos_zip = glob($dir_origem."\*.zip")
foreach (glob($dir_origem."\*.zip") as $arquivo_zip ) {
echo "$arquivo_zip" . "<br>";
$zip = new ZipArchive();
if($zip ->open($arquivo_zip) == true){
echo "Aberto" . "<br/>";
$
}else{
echo "default";
return 0;
}
}
}
}
}
?>
Queria ajuda para poder trabalhar com o htm:
Passo a passo do que terei que fazer:
1 - Juntar vários zips em uma variável, abrir eles e ler o seu conteúdo;
2 - Pegar todos os arquivo htm, fazer a leitura deles.
3 - Com regex, pegar somente o texto escolhido
4 - Mandar esses dados para um banco de dados
Com os outros arquivos eu consegui, um dos scripts utilizados:
function getTxt($dirOrig){
$date = date('d-m-Y');
$zip = new ZipArchive();
$arqZips = glob($dirOrig."\*.zip");
foreach($arqZips as $arqZip){
echo $arqZip.'<br/>';
$er = '/[/W/w]*monitoramento(.+)10(.+)_(.+). ?/';
preg_match($er,$arqZip);
$txt_name=substr($arqZip,0);
$posiçao = strpos($txt_name, "monitoramento");
$name_txt=substr($arqZip,$posiçao);
//print_r() ;
echo "$name_txt". "<br/>";
echo '<br/>';
$count_c = 1;
echo $arqZip . '<br/>';
if ($zip -> open($arqZip) == TRUE) {
//ao abrir o próximo arquivo inicializa o contador em zero
$total_c=0;
// pega o total de xml dentro do zip }
echo '<p>'.'<h5>'."TXT Arqs *_s.txt ".'<h5/>'.'<p/>'.'<br/>';
for ($i = 0; $i < $zip->numFiles; $i++){
$filename = $zip->getNameIndex($i);
if ($a1 = substr($filename,-6) == "_c.txt"){
$total_c++;
}
}
echo 'O numero de arquivos'.': '."$total_c" . "<br>";
// Define o numero de zeros a esquerda
if ($total_c<=9){
$numero_de_zeros = 1;
}elseif ($total_c>=10 && $total_c<=99){
$numero_de_zeros = 2;
}elseif ($total_c>=100 && $total_c<=999){
$numero_de_zeros = 3;
}elseif ($total_c>=1000 && $total_c<=9999){
$numero_de_zeros = 4;
}elseif ($total_c>=10000 && $total_c<=99999){
$numero_de_zeros = 5;
}
while ($count_c <= $total_c) {
$file_arq_c = "raw/" . str_pad($count_c, $numero_de_zeros, "0", STR_PAD_LEFT). "_c.txt".'<br/>';
$file_arq_res_c = $zip->getStream($file_arq_c);
if ( $file_arq_res_c ) {
$texto = '';
while (!feof($file_arq_res_c)) {
//realiza o teste para saber se o programa chegou ao final
$linha = fgets($file_arq_res_c, 5000); // Linha responsavel por ler todas as linhas do arq e armazenar em strings dentro da variavel
$texto = $texto . $linha;
}
echo $file_arq_c;
fclose( $file_arq_res_c);
if (ereg("^CONN",$texto)==true){
$connect = '/^CONNECT (?P<connect>[\S]*)/';
preg_match($connect, $texto, $matches);
$connect_db = $matches ['connect'];
echo "$connect_db" . "<br/>";
$host = '/[\w\W] *Host: (?P<host>[\S]*)/';
preg_match($host, $texto, $matches);
$host_db = $matches ['host'];
echo "$host_db" . "<br/>";
$proxy = '/[\w\W]*Proxy-Connection: (?P<Proxy_Connection>[\S]*)/';
preg_match($proxy, $texto, $matches);
$proxy_db = $matches ['Proxy_Connection'];
echo "$proxy_db" . "<br/>";
$user = '/[\w\W] *User-Agent: (?P<User_Agent>[\S]*)/';
preg_match($user, $texto, $matches);
$user_db = $matches ['User_Agent'];
echo "$user_db" . "<br/>";
$version = '/[\w\W] *Version: (?P<Version>[\S]*)/';
preg_match($version, $texto, $matches);
$version_db = $matches ['Version'];
echo "$version_db" . "<br/>";
$extensions = '/^[\w\W]Random: (?P<extensions>[\s]*)Ciphers:/';
preg_match($extensions, $texto, $matches);
$extensions_db = $matches ['extensions'];
var_dump ($extensions_db);
return;
return;
if (mysql_query("INSERT INTO dados (id, get,nome_arq, host, accept, user_agent, referer, cookie, date) VALUES ('NULL' ,'$connect_db','$filename', '$host_db','$proxy_db','$user_db','$version_db','$extensions_db', '$date' '')")) {
echo "<p>";
printf(" Row inserted : %d .\n\n\n\n", $db);
echo "<br/>";
echo '<p/>';
}else {
echo"<br/>"."<br/>"."Nao possivel o envio para o banco, pois foi encontrado um erro: " . "<br/>" . mysql_error().'<br/>';
}
mysql_close();
}
else{
$p_linha = '/[\w\W]*GET (?P<p_linha>[\S]*)/';
preg_replace($p_linha, $texto, $matches);
$get_db = $matches ['p_linha'];
echo "$get_db" . "<br/>";
$host = '/[\w\W]*Host: (?P<host>[\S]*)/';
preg_match($host, $texto, $matches);
$host_db = $matches ['host'];
$accept = '/[\w\W]*Accept: (?P<accept>[\S]*)/';
preg_match($accept, $texto, $matches);
$accept_db = $matches ['accept'];
$user_agent = '/[\w\W]*User-Agent: (?P<user_agent>[\S]*)/';
preg_match($user_agent, $texto, $matches);
$user_agent_db = $matches ['user_agent'];
$referer = '/[\w\W]*Referer: (?P<referer>[\S])*/';
preg_match($referer, $texto, $matches);
$referer_db = $matches ['referer'];
$cookie = '/[\w\W]*Cookie: (?P<cookie>[\s]*)/';
preg_match($cookie, $texto, $matches);
$cookie_db = $matches ['cookie'];
if (mysql_query("INSERT INTO dados (id, get,nome_arq, host, accept, user_agent, referer, cookie, date) VALUES ('NULL' ,'$get_db','$name_txt', '$host_db','$accept_db','$user_agent_db','$referer_db','$cookie_db', '$date' '')")) {
echo "<p>";
printf(" Row inserted : %d .\n\n\n\n", $db);
echo "<br/>";
echo '<p/>';
}
else {
echo"<br/>"."<br/>"."desiste disso " . "<br/>" . mysql_error();
}
mysql_close();
}
}
$count_c++;
echo "Fim";
echo "<br/>";
}
}
}
}
Seguindo a lógica de cima, pretendo fazer o restante.
Agradeço a Ajuda
Discussão (0)
Carregando comentários...