Roberto Duha Posted August 8, 2018 at 08:09 PM Report #611553 Posted August 8, 2018 at 08:09 PM (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"> </td><td rowspan="1"> </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 August 10, 2018 at 12:23 PM by nunopicado Syntax Highlight
M6 Posted August 9, 2018 at 08:50 AM Report #611559 Posted August 9, 2018 at 08:50 AM 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."
passarito Posted August 9, 2018 at 08:58 AM Report #611560 Posted August 9, 2018 at 08:58 AM 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>
Roberto Duha Posted August 9, 2018 at 07:53 PM Author Report #611580 Posted August 9, 2018 at 07:53 PM gente! Agradeço o rápido retorno. Vou investir nisso hoje e retorno com a evolução da coisa. Valeu!!!
nunopicado Posted August 10, 2018 at 12:49 PM Report #611584 Posted August 10, 2018 at 12:49 PM 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 = ' ') // 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now