Récupérer doc. stocké sur web lettre par lettre

Signaler
Messages postés
72
Date d'inscription
dimanche 18 juin 2017
Statut
Membre
Dernière intervention
18 décembre 2019
-
Messages postés
14674
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 avril 2020
-
Bonsoir,

J'ai fait ce code pour récupérer des décimales d'Euler depuis un site :
    ''' <summary>
    ''' Get Euler String from a database specified.
    ''' </summary>
    Public Shared Function GetEulerFromDatabase(digits As Long, database As EulerDB) As String
        Dim data As String = ""
        Dim wc As New Net.WebClient

        Try
            If digits = 0 Then
                data = 2
            ElseIf digits < 0 Then
                data = 2 * 10 ^ digits
            ElseIf database = EulerDB.MacTutorHistory Then
                data = wc.DownloadString("http://www-history.mcs.st-and.ac.uk/HistTopics/e_10000.html").Replace(" ", "").Replace(vbNewLine, "").Substring(219, 2 + digits)
            End If
        Catch ex As Exception
            Throw ex
        End Try

        Return data
    End Function


PS : EulerDB est une énumération.

Le problème ici est qu'à chaque fois on récupère la page en entier, ce qui peut causer des lenteurs surtout chez les personnes qui ont une mauvaise connexion.
Alors je souhaiterai savoir s'il était possible de récupérer un document (html, txt ou quoi que ce soit) lettres par lettres, c'est à dire par exemple j'ai une fonction GetPageContent(digits As Integer) que je l'appelle en lui donnant comme paramètre digits = 8 j'obtiens par exemple les 219+8 premiers caractères de la page ?

Et sinon pendant que j'y suis petite autre question, j'ai mis des summary dans mon code comme vous pouvez le voir juste ici, parce qu'en fait je code une bibliothèque de classes (.dll), sauf que quand j'exploite son code depuis un autre projet VB, je ne vois pas les summary. Est-ce normal ? Y a t'il moyen de faire en sorte qu'on puisse les voir ?

Merci d'avance, bonne soirée.

2 réponses

Messages postés
2104
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
7 avril 2020
93
Bonjour
La page que tu récupères montre les 10000 décimales de e ( le nombre d'Euler)
Ceux-ci ne changent point : pourquoi ne mets-tu pas cette donnée en tant que variable Public dans ton projet ?
tu n'aurais même plus besoin de télécharger la page ensuite .
Ou alors juste la télécharger une seule fois !
Public EulerString as String = "2.718281828459045235360287471352662497757247093699959574966etc.............." 


Quant à ta seconde question je ne sais point

Messages postés
2104
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
7 avril 2020
93 >
Messages postés
72
Date d'inscription
dimanche 18 juin 2017
Statut
Membre
Dernière intervention
18 décembre 2019

bonjour
Dans ce cas la solution de télécharger une seule et unique fois est la meilleure
Messages postés
72
Date d'inscription
dimanche 18 juin 2017
Statut
Membre
Dernière intervention
18 décembre 2019
>
Messages postés
2104
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
7 avril 2020

Bonjour,
Et il n'est vraiment pas possible de récupérer la page caractère par caractère ?
Messages postés
2104
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
7 avril 2020
93 >
Messages postés
72
Date d'inscription
dimanche 18 juin 2017
Statut
Membre
Dernière intervention
18 décembre 2019

Bonjour
1) Dans ton code d'origine tu définis
Dim data As String = ""

Dim data As String =String.Empty"
serait plus dans la philosophie DoNet

Ensuite tu écris
If digits = 0 Then
                data = 2  ' ici ce n'est pas une String

idem 2 lignes plus loin

2) au data où tu télécharges la page Internet tu récupères une String : .718281828459045235360287471352662497757247093699959574966etc..........."
La valeur de cette String ne change pas
Au lieu de recharger cette valeur à chaque fois que tu appelles la fonction GetEulerFromDatabase tu la mets en variable à l'initialisation de ta classe en la téléchargeant une seule fois et à chaque fois que tu te sers de la fonction GetEulerFromDatabase tu te sers de cette valeur

Public Valeur as String

' à l'initialisation ( tu télécharges une bonne fois pour toutes
Valeur = wc.DownloadString("http://www-history.mcs.st-and.ac.uk/HistTopics/e_10000.html").Replace(" ", "").Replace(vbNewLine, "")


 ''' <summary>
    ''' Get Euler String from a database specified.
    ''' </summary>
    Public Shared Function GetEulerFromDatabase(digits As Long, database As EulerDB) As String
        Dim data As String = ""
               Try
            If digits = 0 Then
                data = 2 ' à corriger
            ElseIf digits < 0 Then
                data = 2 * 10 ^ digits ' à corriger
            ElseIf database = EulerDB.MacTutorHistory Then
                data =Valeur.Substring(219, 2 + digits) ' on retrouve Valeur qui a été téléchargé une seule fois
            End If
        Catch ex As Exception
            Throw ex
        End Try

        Return data
    End Function


si tu veux tu peux même mettre Valeur en paramètre de ta fonction GetEulerFromDatabase

autre chose
- Dans les propriétés du projet à l'onglet Compiler mets Option Strict et Option Explicit sur True
- Et à l'onglet Références décoches la Référence à Microsoft visual Basic

La première option t'oblige à déclarer toutes les variables et à respecter leurs types - > voir le
data = 2
au-dessus où tu mélanges valeur numérique et valeur String ( chaine de caractères)
La seconde option te permet de faire du vrai VB Net ( et non à mélanger du VB 6 avec VB Net : en passant remplace
VBNewline
par
Environment.Newline
Messages postés
72
Date d'inscription
dimanche 18 juin 2017
Statut
Membre
Dernière intervention
18 décembre 2019

Merci pour ta réponse, cependant, dans tout les cas, si je fais
data = 2
, VB convertit le 2 en String automatiquement don ça change rien au final ?
Messages postés
14674
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 avril 2020
140
As-tu activé Option Strict et Option Explicit ?
Ensuite, stocker les décimales en dur serait plus efficace et moins aléatoire.

1) De ce que je comprends, tu interroges la page à chaque calcul, je pense que la requête ne devrait être faite qu'une seule fois, puis le résultat stocké en local/mémoire.
2) Si le site est down, il te faut gérer l'exception, si la page change, il faudra adapter ton code, ... Pour cela, prendre la valeur la plus longue que tu as et la mettre en dur (puis éventuellement raccourcir la chaîne si besoin) sera plus sûr et tout aussi fiable.
Messages postés
14674
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 avril 2020
140
Pour voir les Summary, il faut copier le fichier XML accolé à ton DLL.
Messages postés
72
Date d'inscription
dimanche 18 juin 2017
Statut
Membre
Dernière intervention
18 décembre 2019

C'est à dire ? Mettre le fichier et la DLL dans un même dossier ?
Messages postés
14674
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 avril 2020
140
Oui
Messages postés
72
Date d'inscription
dimanche 18 juin 2017
Statut
Membre
Dernière intervention
18 décembre 2019
>
Messages postés
14674
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 avril 2020

Merci beaucoup, cela fonctionne.
Messages postés
14674
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 avril 2020
140
Dans ce cas, pense à marquer la question comme résolue (petit engrenage -> "Marquer comme résolu")
Messages postés
2104
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
7 avril 2020
93
Bonjour NHenry
A mon avis la seconde question est résolue ( celle concernant ton premier message)
La première question concernant le chargement de la page internet ne l'est point à mon avis !
Il ne m'a pas encore répondu