Jump to content

Recommended Posts

Posted (edited)

Olá! Meu conhecimento em Pascal pode ser considerado básico. E não consigo escrever uma solução para o problema abaixo:

No site da Caixa, disponibilizam os resultados (todos eles) de todas as loterias. Ele vem em formato HTM. Para a Megasena, é uma tabela mostrando nas linhas todos os resultados com informações diversas distribuidas pelas colunas. Cada linha um resultado e nas 21 colunas (Megasena) , informações pertinentes ao próprio.

Preciso colocar num arquivo texto sequencial a informação de cada uma dessas 21 colunas de todos os sorteios já realizados.

O arquivo baixado da Caixa, possui um trecho inutil no começo e outro no final. A parte central tem o que nos interessa, com HTM uniforme que se repete em todas as linhas dos sorteios. Problema que ele não tem marcação de final de linha..... quando mando ler uma linha, ele tenta ler o arquivo todo (1.2Mb) e dá erro de execução. Foi o que conclui.

 

Trecho que interessa:

<tr>
<td rowspan="1">1</td>
<td rowspan="1">11/03/1996</td>
<td rowspan="1">41</td>
<td rowspan="1">05</td>
<td rowspan="1">04</td>
<td rowspan="1">52</td>
<td rowspan="1">30</td>
<td rowspan="1">33</td>
<td rowspan="1">0,00</td>
<td rowspan="1">0</td>
<td rowspan="1">&nbsp</td><td rowspan="1">&nbsp</td>
<td rowspan="1">0,00</td>
<td rowspan="1">17</td>
<td rowspan="1">39.158,92</td>
<td rowspan="1">2016</td>
<td rowspan="1">330,21</td>
<td rowspan="1">SIM</td>
<td rowspan="1">1.714.650,23</td>
<td rowspan="1">0,00</td>
<td rowspan="1">0,00</td></tr>

São (hoje) 2065 resultados da Megasena e logo, 2065 trechos desses.

 

Podem me dar alguma dica do caminho a seguir? Tem que ser em Pascal. Uso o Lazarus.

 

Vou publicando aqui o desenrolar. 

 

Abraço à todos e grato pela atenção.

Edited by nunopicado
Syntax Highlight
Posted

Usa expressões regulares. Vê o TRegExpr.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Posted

A solução que tenho para isso, é fazer a coisa por fazes.

Antes de mais tens de separar as linhas. Para isso tens de colocar o #13 no locais corretos.

A maneira mais rápida e fácil de fazer isso é copiar tudo para um segundo ficheiro e colocar o caracter #13 a seguir a todos os caracteres ">"

Var
	f1, f2 : File of text;
	c:char;
	s:string

begin
	assign(f1,'Megasena.txt');
	assign(f2,'Megasena2.txt');
	reset(f);
	rewite(f2);
	while not eof(f) do begin
		read(f,c);
		write(f2,c);
		if c='>' then write(f2,'#13');
	end;
	close(f);
	close(f2);
end;

vais ficar com o ficheiro assim:

<tr>

<td rowspan="1">

1</td>

<td rowspan="1">

11/03/1996</td>

<td rowspan="1">

41</td>

</td>
....

 

Na próxima fase já podes ler o ficheiro string a string de forma tradicional.

Os valores que te interessam são todos os que estiverem na string que contém </td>

Posted
Em 08/08/2018 às 21:09, Roberto Duha disse:

Problema que ele não tem marcação de final de linha..... quando mando ler uma linha, ele tenta ler o arquivo todo (1.2Mb) e dá erro de execução.

Qual o método que estás a usar para ler o ficheiro? O Lazarus consegue abrir ficheiros maiores do que esse sem problema, dependendo do método o usado.

A minha recomendação é que usasses uma TStringList para ler o ficheiro, e depois processes tudo em memória até à hora de gravar.

Por exemplo, algo deste género pode resolver:

uses
    System.SysUtils
  , Classes
  ;

var
  Lst: TStringList;
  i: Integer;
  s: string;

begin
  Lst := TStringList.Create;
  try
    // Carrega o conteúdo do ficheiro
    Lst.LoadFromFile('mega.html');

    // Faz o parsing, eliminando as linhas que não importam, e o excedente das linhas que importem
    for i := Pred(Lst.Count) downto 0 do
      if Pos('<td', Lst[i]) = 0
        then Lst.Delete(i) // Elimina qualquer linha que não tenha um inicio de valor ('<td')
        else
          begin // Das linhas com valores, limpa o que não importa  

            Delete(s, 1, Pos('>', s)); // Limpa tudo o que está antes (até ao caracter '>')

            Delete(s, Pos('<', s), s.Length); // Limpa tudo o que está depois (do caracter '<')

            s := Trim(Lst[i]); // Limpa espaços antes e depois do valor final

            if s.IsEmpty or (s = '&nbsp') // Limpa valores que não façam falta ao resultado final, como eventualmente linhas vazias e com símbolos html
              then Lst.Delete(i)
              else Lst[i] := s;
          end;

    // Grava o resultado final 
    Lst.SaveToFile('E:\Users\nunopicado\Dropbox\mega.txt');
  finally
    Lst.Free;
  end;
end.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.