Ir para o conteúdo
Roberto Duha

Separar conteúdo de arquivo HTM com Pascal

Mensagens Recomendadas

Roberto Duha

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.

 

 

Editado por nunopicado
Syntax Highlight

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

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."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
passarito

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>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Roberto Duha

gente! Agradeço o rápido retorno. Vou investir nisso hoje e retorno com a evolução da coisa. Valeu!!!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado
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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.