...cURL session over!
...Zip not modified!
...Zip Extracted!
...File Opened!
...File closed!

Data Mining - Mega Sena

As estatísticas abaixo foram obtidas do arquivo D_megase.zip, proveniente do site da Caixa Econômica Federal.

1. O último prêmio distribuído foi em 20/03/2019 (sorteio nº 2135), no valor de R$ 32.689.083,52.
As dezenas ganhadoras deste sorteio foram:23, 48, 59, 28, 40, 9

2. O maior prêmio já distribuído foi de R$ 306.718.743,68, que foi sorteado em 31/12/2017 (sorteio nº 2000).
Esse sorteio teve 17 ganhador(es).
As dezenas ganhadoras deste sorteio foram:

3. O sorteio com o maior número de ganhadores foi o de nº 2110, de 31/12/2018.
52 pessoas dividiram o prêmio de R$ 302.536.382,72, ficando com R$ 5.818.007,36 cada.
As dezenas ganhadoras deste sorteio foram:

4. Frequência de sorteio das dezenas, em 2135 sorteios:
01
(211)
02
(218)
03
(199)
04
(235)
05
(242)
06
(222)
07
(200)
08
(213)
09
(190)
10
(244)
11
(213)
12
(214)
13
(222)
14
(199)
15
(194)
16
(219)
17
(225)
18
(217)
19
(202)
20
(206)
21
(185)
22
(189)
23
(234)
24
(230)
25
(198)
26
(173)
27
(224)
28
(224)
29
(217)
30
(223)
31
(204)
32
(220)
33
(231)
34
(221)
35
(216)
36
(217)
37
(223)
38
(213)
39
(201)
40
(209)
41
(217)
42
(225)
43
(222)
44
(220)
45
(207)
46
(210)
47
(206)
48
(195)
49
(210)
50
(217)
51
(228)
52
(224)
53
(241)
54
(234)
55
(183)
56
(221)
57
(194)
58
(209)
59
(211)
60
(199)

5. Há quantos sorteios as dezenas foram sorteadas pela última vez?
01
(8)
02
(4)
03
(4)
04
(18)
05
(3)
06
(1)
07
(8)
08
(14)
09
(0)
10
(14)
11
(7)
12
(6)
13
(5)
14
(12)
15
(12)
16
(5)
17
(14)
18
(3)
19
(2)
20
(2)
21
(1)
22
(27)
23
(0)
24
(7)
25
(15)
26
(2)
27
(9)
28
(0)
29
(14)
30
(3)
31
(6)
32
(6)
33
(25)
34
(1)
35
(3)
36
(5)
37
(14)
38
(15)
39
(3)
40
(0)
41
(15)
42
(16)
43
(11)
44
(8)
45
(31)
46
(1)
47
(11)
48
(0)
49
(13)
50
(12)
51
(2)
52
(2)
53
(5)
54
(1)
55
(5)
56
(12)
57
(2)
58
(9)
59
(0)
60
(3)

6. E aqui vai o código-fonte que gerou as estatísticas:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
    <title>Mining statistics from lottery results</title> 
    <style type="text/css"> 
        body, td, p    {
                        font-family: Verdana; font-size: small;
                    } 
        table, td    {
                        border:1px solid #444; 
                        border-collapse: collapse;
                    } 
        caption        {
                        height: 4em; 
                        font-weight: bold; 
                        padding-top: 5px; 
                        background-color: #eee;
                    } 
        td            {
                        text-align: center; 
                        width: 3.5em; 
                        height: 3em;
                    } 
        code        {
                        background-color: #eee; 
                        font-family: Courier New; 
                        font-size: 9pt; 
                        display: block; 
                        width: 800px; height: 300px; 
                        overflow: auto;
                    } 
        .err        {
                        display: auto; 
                        color: #f00;
                    }
        .msg        {display: none;} 
        .niv1        {background-color: #7F7F7F;} 
        .niv2        {background-color: #999999;} 
        .niv3        {background-color: #B2B2B2;} 
        .niv4        {background-color: #CCCCCC;} 
        .niv5        {background-color: #E5E5E5;} 
        .niv6        {background-color: #FFFFFF;} 
    </style> 
</head> 
<body> 
<?php 
/** 
 * Exercício de data mining em PHP 
 * O objetivo é ler o arquivo de resultados da Mega-Sena, baixado do site da Caixa Econômica Federal, e extrair estatísticas. 
 * Professor: Cristiano 
 * Aluno: Felipe Plattek 
 * Início: 24/10/2007 13:00:00 BRST (GMT-2) 
 * Ultima edição: 03/09/2014 10:20:00 BRT (GMT-3) 
 * Teor da últ. ed.: O arquivo da Caixa mudou, acrescentando duas novas colunas: Cidade e UF
 *                   O índice das colunas após a 9 teve de aumentar em 2.
 *                      Efetuadas alterações na lógica de extração de linhas para evitar erros.
*/ 
//error_reporting(E_ALL); 
//ini_set("display_errors",1); 

//constantes que refletem a estrutura do arquivo de resultados da Mega-Sena 
define('NUM_SORT',0); 
define('DAT_SORT',1); 
define('DEZ1',2); 
define('DEZ2',3); 
define('DEZ3',4); 
define('DEZ4',5); 
define('DEZ5',6); 
define('DEZ6',7); 
define('QNT_GANHA',9); 
define('VAL_GANHA',11); 
define('QNT_QUINA',12); 
define('VAL_QUINA',13); 
define('QNT_QUADRA',14); 
define('VAL_QUADRA',15); 
define('IS_ACUMUL',16); 
define('VAL_ACUMUL',17); 

//vetor que vai armazenar o numero de vezes que cada dezena foi sorteada. 
//a função array_fill inicializa todos os elementos do vetor com o numero 0. 
$frequencia array_fill(0,60,0); 
$ultimas array_fill(0,60,0); 
$encalhadas array_fill(0,60,0); 
$ult_dezenas array_fill(0,6,0); 
$dezenas array_fill(0,6,0); 

$maior_premio 0.0
$ganhadores_maior 0
$data_maior '0'
$num_sorteio_maior 0
$frequencia_maior ''

$mais_ganhadores 0
$mais_ganha_premio 0
$mais_ganha_premio_parc 0
$mais_ganha_data '0'
$mais_ganha_sorteio 0
$mais_ganha_dezenas ''
$mais_encalhadas = array(); 

$line_counter 0
$termina_linha '</tr>'

// baixa o zip do site da caixa  
if (function_exists('curl_init')) {  
    
// initialize a new curl resource  
    
$ch curl_init(); 
     
    
// set the url to fetch  
    
curl_setopt($chCURLOPT_URL,  
                   
'http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip');  

    
// don't give me the headers just the content  
    
curl_setopt($chCURLOPT_HEADER0);  
    
curl_setopt($chCURLOPT_FOLLOWLOCATION1); 
    
curl_setopt($chCURLOPT_MAXREDIRS2); 
    
curl_setopt($chCURLOPT_AUTOREFERER1); 
    
curl_setopt($chCURLOPT_COOKIE"security=true; path=/"); 

    
//download only if file modified since last download  
    
if(file_exists('D_megase.zip') && $cTime = @filectime('D_megase.zip')){ 
        
curl_setopt($chCURLOPT_HTTPHEADER, array('If-Modified-Since: '.date('r',$cTime)));  
    }  

    
// return the value instead of printing the response to browser  
    
curl_setopt($chCURLOPT_RETURNTRANSFER1);  

    
// use a user agent to mimic a browser  
    
curl_setopt($chCURLOPT_USERAGENT,  
                   
'Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.7.5) Gecko/20041107 Firefox/1.0'); 

    
$content curl_exec($ch);  
    
curl_close($ch); 
} else {  
        
// curl library is not installed so we better die  
    
die('<div class="err">Não foi possível baixar o arquivo do site da CEF</div>');  
}  
echo 
'<div class="msg">...cURL session over!</div>';  
//escreve o zip no diretório se tiver sido mudado  
if(strlen($content)>10){  
    if(!
$fd fopen('D_megase.zip','w')) die('<div class="err">Não foi possível abrir o arquivo para escrita</div>');
    if(!
fwrite($fd,$content)) die('<div class="err">Não foi possível salvar o arquivo</div>'); 
    
fclose($fd);  
    echo 
'<div class="msg">...Zip stored!</div>';  
}else{  
    echo 
'<div class="msg">...Zip not modified!</div>';  
}  

// extrai o arquivo de resultados (não funciona em windows) 
$tmp=array(); 
$res=-1
$tmp2 exec'unzip -o D_megase.zip -x'$tmp$res); 
if(
$res!=0) die('<div class="err">Não foi possível extrair o arquivo compactado.</div>'); 
echo 
'<div class="msg">...Zip Extracted!</div>'

//Finalmente, abre o arquivo para leitura 
if(!$fd fopen('D_MEGA.HTM','r')) die('<div class="err">Não foi possível abrir o arquivo para leitura!</div>'); 
echo 
'<div class="msg">...File Opened!</div>'

//esse loop vai posicionar o ponteiro no ponto onde começa a informação desejada 
//pois a informação começa logo após o primeiro tag de final de TR. 
$file_buffer '12345'
$res=0;
while (!
feof($fd) && (strcasecmp($file_buffer,$termina_linha)!=0)) { 
    if(
strlen($file_buffer)>=5$file_buffer substr($file_buffer,1,4); // pula o primeiro caractere
    
$file_buffer .= trim(fgetc($fd)); // acrescenta ao buffer 1 caractere
$res++;
//echo htmlentities($file_buffer)."<br/>\r\n";
//if($res>2906) break;

//echo '<div class="err">'.$res.'</div>';
//esse loop vai correr até o fim do arquivo, extraindo dados de cada TR. 
while (!feof($fd)){ 

    
$file_buffer ''
    
$line_buffer ''

    
//esse loop lê linhas do arquivo, até encontrar um final de TR 
    //e armazena a linha em $line_buffer 
    
while (!feof($fd) && (strcasecmp($termina_linha,substr($file_buffer,-5,5))!=0)) { 
        
$file_buffer trim(fgets($fd)); 
        
$line_buffer .= ($file_buffer=='')?'':$file_buffer.':'
    } 

    if(isset(
$_GET['dump']) && $_GET['dump']=='true') echo $line_buffer,'<br/>'

    
//aqui transformamos o $line buffer em um array com a função explode
    
$line_array explode(':',trim(strip_tags($line_buffer),': \t\n\r\0\x0B')); 
    
    
// se a linha extraída não possui todas as colunas, ignora a linha
    
if(count($line_array) < VAL_ACUMUL) continue;

    
// por alguma razão, ainda não debugada, existem algumas linhas que geram index -1 e eu estou as IGNORANDO
    // e ignoramos também as linhas onde não houveram ganhadores da quadra (registros irregulares) 
    
if((ltrim($line_array[DEZ1],'0'))<|| $line_array[QNT_QUADRA]==0) continue; 

    
$last_good_line $line_array
    
$line_counter++; //contando quantos sorteios tem no arquivo 
    
for($i=0;$i<60;$ultimas[$i++]++); //acrescentando 1 a todas as dezenas na contagem de ultimas sorteadas 

    //registramos a ocorrencia das diferentes dezenas no sorteio. 
    //cumulativamente teremos a estatística de frequências 
    
for($i=DEZ1;$i<=DEZ6;$i++){ 
        
$index ltrim($line_array[$i],'0')-1// subtraímos 1 para ficar com a primeira dezena no index 0 
        
$frequencia[$index]++; 

        
// registra quanto tempo essa dezena esteve 'encalhada' e zera o contador 
        
$mais_encalhadas[$ultimas[$index]][0] = isset($mais_encalhadas[$ultimas[$index]])?$mais_encalhadas[$ultimas[$index]][0]+1:1
        
$mais_encalhadas[$ultimas[$index]][1] = array($index+1,$line_array[DAT_SORT]); 
        
$ultimas[$index]=0

        
$dezenas[$i-DEZ1] = $index+1//armazenamos as dezenas do ultimo sorteio 
    


    
//utilizamos a função str_replace para reformatar o valor do rateio 
    
$premio_parc str_replace(',','.',str_replace('.','',$line_array[VAL_GANHA])); 
    
//multiplica-se o valor do rateio pelo número de ganhadores 
    
$premio $line_array[QNT_GANHA]*$premio_parc
    
//armazena os dados do ultimo sorteio premiado 
    
if($premio>0){ 
        
$ult_premio $premio
        
$ult_sorteio $line_array[NUM_SORT]; 
        
$ult_data $line_array[DAT_SORT]; 
        for(
$i=DEZ1;$i<=DEZ6;$i++) $ult_dezenas[$i-DEZ1] = ltrim($line_array[$i],'0'); 
    } 
    
//se esse é o maior prêmio até então, armazenamos os dados sobre ele 
    
if($premio>$maior_premio){ 
        
$maior_premio $premio
        
$ganhadores_maior $line_array[QNT_GANHA]; 
        
$num_sorteio_maior $line_array[NUM_SORT]; 
        
$data_maior $line_array[DAT_SORT]; 
        for(
$i=DEZ1;$i<=DEZ6;$i++) $frequencia_maior[$i-DEZ1] = $line_array[$i]; 
    }
//end if 
    //se esse é o maior número de ganhadores até então, armazenamos os dados 
    
if($line_array[QNT_GANHA]>$mais_ganhadores){ 
        
$mais_ganhadores $line_array[QNT_GANHA]; 
        
$mais_ganha_premio $premio
        
$mais_ganha_premio_parc $line_array[VAL_GANHA]; 
        
$mais_ganha_sorteio $line_array[NUM_SORT]; 
        
$mais_ganha_data $line_array[DAT_SORT]; 
        for(
$i=DEZ1;$i<=DEZ6;$i++) $mais_ganha_dezenas[$i-DEZ1] = $line_array[$i]; 
    }
//end if 
}//end while 

//fechamos o arquivo 
fclose($fd); 
echo 
'<div class="msg">...File closed!</div>'

//formatando o valor do premio com separadores de milhar e virgula decimal 
$ult_premio number_format($ult_premio,2,',','.'); 
$maior_premio number_format($maior_premio,2,',','.'); 
$mais_ganha_premio number_format($mais_ganha_premio,2,',','.'); 

//formatando as dezenas ganhadoras como um string 
$ult_dezenas join(', ',$ult_dezenas); 
$frequencia_maior join(', ',$frequencia_maior); 
$mais_ganha_dezenas join(', ',$mais_ganha_dezenas); 

?> 

<h2>Data Mining - Mega Sena</h2> 
<p>As estatísticas abaixo foram obtidas do arquivo <a href="D_megase.zip">D_megase.zip</a>, 
proveniente do site da <a 
href="http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip">Caixa Econômica Federal</a>.</p> 
<?php if($last_good_line[IS_ACUMUL]=='SIM'):?> 
<p><strong>0.</strong> O último sorteio (nº <?=$last_good_line[NUM_SORT]?>) foi em <?=$last_good_line[DAT_SORT]?>
As dezenas sorteadas foram: <?php for($i=DEZ1;$i<DEZ6;++$i) echo $last_good_line[$i],', '; echo $last_good_line[DEZ6];?>.<br/> 
O valor acumulado para o próximo sorteio é de <strong>R$ <?=$last_good_line[VAL_ACUMUL];?></strong>. 
</p> 
<?php endif;?> 
<p><strong>1.</strong> O último prêmio distribuído foi em <?=$ult_data?> (sorteio nº <?=$ult_sorteio?>), 
no valor de <strong>R$ <?=$ult_premio?></strong>.<br/> 
As dezenas ganhadoras deste sorteio foram:<?=$ult_dezenas?> 
</p> 
<p><strong>2.</strong> O maior prêmio já distribuído foi de <strong>R$ 
<?=$maior_premio?></strong>, que foi sorteado em 
<?=$data_maior?> (sorteio nº <?=$num_sorteio_maior?>).<br/> 
Esse sorteio teve <?=$ganhadores_maior?> ganhador(es).<br/> 
As dezenas ganhadoras deste sorteio foram: 
<?=$frequencia_maior?> 
</p> 
<p><strong>3.</strong> O sorteio com o maior número de ganhadores foi o de nº 
<?=$mais_ganha_sorteio', de ',$mais_ganha_data,'.<br/>',$mais_ganhadores?> 
 pessoas dividiram o prêmio de <strong>R$ <?=$mais_ganha_premio?></strong>, ficando com R$ 
<?=$mais_ganha_premio_parc?> cada.<br/> 
As dezenas ganhadoras deste sorteio foram: <?=$mais_ganha_dezenas?> 
</p> 
<table border="1"> 
    <caption>4. Frequência de sorteio das dezenas, em <?=$line_counter?> sorteios:</caption> 
    <tr> 
<?php 
//calculando níveis de frequência, para atribuir cores diferentes na tabela 
$nivel_min min($frequencia); 
$nivel_max max($frequencia); 
$nivel_range floor(($nivel_max-$nivel_min)/5); 

for(
$i=0;$i<60;$i++){ 
    if(
$i>0&&$i%10==0) echo 
    </tr><tr>'

    
$bgclass 'niv'.(floor(($nivel_max-$frequencia[$i])/$nivel_range)+1); 
    echo 

    <td class="'
,$bgclass,'"><strong>',str_pad(($i+1),2,'00',STR_PAD_LEFT
        ,
'</strong><br/>(',$frequencia[$i],')</td>'

?> 
    </tr> 
</table> 
<p></p> 
<table border="1"> 
    <caption>5. Há quantos sorteios as dezenas foram sorteadas pela última vez?</caption> 
    <tr> 
<?php 
//calculando 
$nivel_min 0
$nivel_max max($ultimas); 
$nivel_range floor($nivel_max/5); 

for(
$i=0;$i<60;$i++){ 
    if(
$i>0&&$i%10==0) echo 
    </tr><tr>'

    
$bgclass 'niv'.(floor(($nivel_max-$ultimas[$i])/$nivel_range)+1); 
    echo 

    <td class="'
,$bgclass,'"><strong>',str_pad(($i+1),2,'00',STR_PAD_LEFT
        ,
'</strong><br/>(',$ultimas[$i],')</td>'

?> 
    </tr> 
</table> 
<p></p> 
<p>6. E aqui vai o código-fonte que gerou as estatísticas:</p> 
<p><?php highlight_file('index.php');?></p> 
</body> 
</html>