Lecture d'un fichier texte sur serveur (RESOLU)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Lecture d'un fichier texte sur serveur (RESOLU)

Message par MetalOS »

Salut Tous le monde,

Je cherche à lire ligne après ligne le contenue d'un fichier texte sur mon serveur afin de récupérer les Longitudes et Latitudes de ses dernières dans des variables séparé. J'arrive bien à le faire quand je télécharge le fichier sur mon disque dur mais j'aimerai faire ca en ligne afin de ne télécharger aucun fichiers.

Voici le fichier en question:

http://infoprojectsoftware.free.fr/brute_donnee.txt

Je ne sais pas si avec le WebGadget c'est possible ou si il faut charger le fichier dans un EditorGadget pour ensuite le traiter. Je ne sais vraiment pas comment m'y prendre. Une fois de plus merci d'avance pour votre aide.

PS: Je suis sur Mac OS X donc l'utilisation d'API Windows ne marchera pas.
Dernière modification par MetalOS le sam. 24/août/2013 9:16, modifié 1 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Lecture d'un fichier texte sur serveur

Message par GallyHC »

Bonjour,

Si tu ne désire pas avoir le fichier copier en local, la méthode la plus simple est de télécharger le fichier en mémoire et de l'analysé après. enfin c'est ce que je penses.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Lecture d'un fichier texte sur serveur

Message par venom »

GallyHC a écrit :Bonjour,

Si tu ne désire pas avoir le fichier copier en local, la méthode la plus simple est de télécharger le fichier en mémoire et de l'analysé après. enfin c'est ce que je penses.

Cordialement,
GallyHC
Oui,

Ou tu peut aussi récupérer le code source via WebGadget

Code : Tout sélectionner

  If OpenWindow(0,0,0,600,300,"WebGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    WebGadget(0,10,10,580,280,"http://infoprojectsoftware.free.fr/brute_donnee.txt")
  EndIf 
     
  Repeat
   EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
     Select EventGadget()
          
       Case 0
        Select EventType()
         Case #PB_EventType_DownloadEnd
            Debug GetGadgetItemText(0, #PB_Web_HtmlCode)
           
        EndSelect
        
     EndSelect 
    EndIf 
  Until EventID = #PB_Event_CloseWindow
A toi de voir.





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Lecture d'un fichier texte sur serveur

Message par MetalOS »

Récupérer le code avec le WebGadget je connaissais mais comment le traiter ensuite ? C'est là ou je bloque.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Lecture d'un fichier texte sur serveur

Message par Backup »

....
Dernière modification par Backup le mar. 19/août/2014 10:00, modifié 1 fois.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Lecture d'un fichier texte sur serveur

Message par GallyHC »

@Dobro
MetalOS a écrit :PS: Je suis sur Mac OS X donc l'utilisation d'API Windows ne marchera pas.
;)
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Lecture d'un fichier texte sur serveur

Message par Backup »

arf ! .. comme quoi MacOS n'est pas parfait ! :twisted:
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Lecture d'un fichier texte sur serveur

Message par MetalOS »

J'avais déjà essayer un code identique qui ce trouve sur le forum Dobro mais ca ne fonctionne pas sous Mac évidement. Autrement peut on lire ligne par ligne le contenue d'un EditorGadget si je charge le fichier dynamiquement ? Et si oui comment ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Lecture d'un fichier texte sur serveur

Message par Backup »

sinon tu telecharge vite fait le fichier txt

Code : Tout sélectionner

;récupere un fichier sur un site
; c'est la base d'un aspirateur de site ;o)
; Purebasic 4.20 et +++²
InitNetwork()
If ReceiveHTTPFile("http://forums.purebasic.com/english/index.php", "E:\robots.txt")  ; fonctionne
	Debug "Succes"
	Else
	Debug "Erreur"
EndIf; EPB
et tu le lis avec openfile() et Texte$ = ReadString(#Fichier [, Options [, Longueur]])
ensuite c'est pareil pour extraire les lignes , donnée que pour mon exemple :)

sans telecharger ... j'vois pas ...


maintenant ....
le gadget web , contient :
GetGadgetItemText(): Les constantes suivantes peuvent être utilisées pour obtenir une information:
#PB_Web_HtmlCode : Renvoie le code html du gadget.
#PB_Web_PageTitle : Renvoie le titre de la page affichée.
#PB_Web_StatusMessage: Renvoie le message actuel de la barre d'état.
#PB_Web_SelectedText : Renvoie le texte sélectionné à l'intérieur du gadget.
ça veut dire que si tu sélectionnes ton texte , tu peux le récupérer !
pour sélectionner un text , c'est pas trop dur ....
simulation de Ctrl+A sur l’éditeur et voila :) (arf .. sous MacOs je sais pas faire )

sinon tu fais l'action a la main , tu copies ce qui t’intéresses dans le press papier (avec Ctrl+c) , et tu récupères avec ton prg en utilisant :
Texte$ = GetClipboardText()
puis tu traites ...
Dernière modification par Backup le jeu. 22/août/2013 10:57, modifié 1 fois.
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Lecture d'un fichier texte sur serveur

Message par venom »

Ou peut être récupéré le code html, puis le mettre dans un EditorGadget le tout sur une fenêtre invisible ?

Mais bon c'est bien plus rapide de telecharger un fichier texte. :)





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
MetalOS
Messages : 1510
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Lecture d'un fichier texte sur serveur

Message par MetalOS »

J'arrive déjà en téléchargent le fichier texte et le traiter mais j'aimerais sans le télécharger et le traiter en ligne.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Lecture d'un fichier texte sur serveur

Message par GallyHC »

MetalOS a écrit :J'arrive déjà en téléchargent le fichier texte et le traiter mais j'aimerais sans le télécharger et le traiter en ligne.
C'est juste impossible sur des serveurs internet (pas de téléchargement, pas d'info) . Après si c'est un réseau local ben tu fait juste une partage de disque ou dossier et voila.

GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lecture d'un fichier texte sur serveur

Message par falsam »

J'ai modifier le code de mp303 qui permet de récupérer un fichier se trouvant sur un serveur et de l'enregistrer en local.

Le résultat du téléchargement se trouve maintenant dans une variable que tu peux ajouter dans ton EditorGagget. J'espére que je n'ai pas laissé de code inutile.

Le test est à la fin de ce code. Mon fichier de test est toujours en ligne.

HTTP_GET_Memory.pbi

Code : Tout sélectionner

#HTTP_BUFFER_SIZE = 4096  ; receive buffer size
#HTTP_IDLE_DELAY = 20     ; delay during inactivity
#HTTP_LAG_DELAY = 50      ; delay during little activity
#HTTP_TIMEOUT = 10000     ; timeout in milliseconds

#HTTP_OK = 0

#HTTP_ERROR_CONNECT   = -1     ; Unable to connect to the specified server
#HTTP_ERROR_MEMORY    = -2     ; Unable to allocate memory for response buffer
#HTTP_ERROR_TIMEOUT   = -3     ; #HTTP_TIMEOUT exceeded
#HTTP_ERROR_FILE      = -4     ; Local file could not be created
#HTTP_ERROR_PROTOCOL  = -5     ; Unknown HTTP protocol (version 1.0 or 1.1 required)

Enumeration ; Parser states
  #HTTP_STATE_EXPECT_HEADER
  #HTTP_STATE_HEADER
  #HTTP_STATE_DATA
EndEnumeration

Macro HTTP_Debug(Str)
  ;Debug Str ; comment out this line to disable debugging messages
EndMacro

Procedure HTTP_GET(URL.s)
  ; function returns 0 on successful download (HTTP status 200)
  ; negative number in case of tehnical errors (see #HTTP_ERROR codes above)
  ; or positive number in case of HTTP status code other than "200"
  
  Protected Host.s      ; Server's hostname
  Protected Path.s      ; Remote path
  Protected Port.l = 80 ; Port number
  
  Protected Pos.l       ; Used for various string operations
  
  Protected Con.l       ; Connection ID
  
  Protected Request.s   ; HTTP request headers
  
  Protected CRLF.s = Chr(13) + Chr(10)
  
  ; Parse URL:
  If FindString(URL, "http://", 1) = 1 : URL = Right(URL, Len(URL)-7) : EndIf
  
  Pos = FindString(URL, "/", 1)
  If Pos = 0
    Host = URL
    Path = "/"
  Else
    Host = Left(URL, Pos-1)
    Path = Right(URL, Len(URL)-Pos+1)
  EndIf
  
  Pos = FindString(Host, ":", 1)
  If Pos > 0
    Port = Val(Right(Host, Len(Host)-Pos))
    Host = Left(Host, Pos-1)
  EndIf
  
  HTTP_Debug("Host: " + Chr(34) + Host + Chr(34))
  HTTP_Debug("Path: " + Chr(34) + Path + Chr(34))
  HTTP_Debug("Port: " + Str(Port))

  ; Allocate response buffer:
  
  Protected *Buffer
  *Buffer = AllocateMemory(#HTTP_BUFFER_SIZE)
  If Not *Buffer : ProcedureReturn #HTTP_ERROR_MEMORY : EndIf
  
  ; Open connection:
  
  Con = OpenNetworkConnection(Host, Port)
  If Con = 0 : ProcedureReturn #HTTP_ERROR_CONNECT : EndIf
  
  ; Send HTTP request:
  
  Request = "GET " + Path + " HTTP/1.0" + CRLF
  Request + "Host: " + Host + CRLF
  Request + "Connection: Close" + CRLF + CRLF
  
  SendNetworkString(Con, Request)
  
  ; Process response:
  
  Protected Exit.l = #False   ; Exit flag
  
  Protected Bytes.l           ; Number of bytes received
  
  Protected Time.l = ElapsedMilliseconds() ; Time of last data reception
  
  Protected Status.l = #HTTP_OK ; Status flag
  
  Protected State.l = #HTTP_STATE_EXPECT_HEADER
  
  Protected String.s          ; Parser input
  Protected Index.l           ; Parser position
  Protected Char.s            ; Parser char
  
  Protected Header.s          ; Current header
  
  Protected HTTP_Protocol.s   ; HTTP protocol version
  Protected HTTP_Status.l = 0 ; HTTP status code
  
  Protected Redirected.b = #False
  
  Repeat
    
    If NetworkClientEvent(Con) = #PB_NetworkEvent_Data
      
      Repeat
        
        Bytes = ReceiveNetworkData(Con, *Buffer, #HTTP_BUFFER_SIZE)
        
        If Bytes = 0
          Exit = #True
          
        Else
          
          If Bytes < #HTTP_BUFFER_SIZE : Delay(#HTTP_LAG_DELAY) : EndIf
          
          HTTP_Debug("Received: " + Str(Bytes) + " bytes")
          
          If State = #HTTP_STATE_DATA
            
            ;Result = PeekS(*Buffer+Index)
            
          Else
            
            String = PeekS(*Buffer, Bytes, #PB_Ascii)
            
            Index = 0
            
            Repeat
              
              Index + 1
              Char = Mid(String, Index, 1)
              
              Select State
                  
                Case #HTTP_STATE_EXPECT_HEADER
                  
                  If Char = Chr(10)
                    State = #HTTP_STATE_DATA        
                    If Index < Bytes
                      
                      ;Result = PeekS(*Buffer+Index)
                      
                    EndIf
                  ElseIf Char = Chr(13)
                    ; (ignore)
                                       
                  Else
                    Header = Char
                    State = #HTTP_STATE_HEADER
                  EndIf
                
                Case #HTTP_STATE_HEADER
                  If Char = Chr(10)
                    If HTTP_Status = 0
                      HTTP_Protocol = StringField(StringField(Header, 1, " "), 2, "/")
                      HTTP_Status = Val(StringField(Header, 2, " "))
                      If ((HTTP_Protocol <> "1.0") And (HTTP_Protocol <> "1.1")) Or (StringField(StringField(Header, 1, " "), 1, "/") <> "HTTP") Or (HTTP_Status = 0)
                        HTTP_Debug("HTTP Protocol error!")
                        Exit = #True
                        Status = #HTTP_ERROR_PROTOCOL
                      EndIf
                      HTTP_Debug("HTTP Protocol " + HTTP_Protocol + ", Status " + Str(HTTP_Status))
                      If (HTTP_Status >= 300) And (HTTP_Status < 400)
                        HTTP_Debug("Redirection...")
                        Redirected = #True
                      ElseIf HTTP_Status <> 200
                        Status = HTTP_Status
                        Exit = #True
                        HTTP_Debug("Status <> 200 - abort!")
                      EndIf
                    EndIf
                    State = #HTTP_STATE_EXPECT_HEADER
                  ElseIf Char = Chr(13)
                    ; (ignore)
                  Else
                    Header + Char
                  EndIf
                
              EndSelect
              
            Until (State = #HTTP_STATE_DATA) Or (Index = Bytes) Or (Exit = #True)
            
          EndIf
          
          Time = ElapsedMilliseconds()
          
        EndIf
        
      Until Exit = #True
      
    Else
      
      HTTP_Debug("Idle...")
      Delay(#HTTP_IDLE_DELAY)
      
      If ElapsedMilliseconds() - Time > #HTTP_TIMEOUT
        Exit = #True
        Status = #HTTP_ERROR_TIMEOUT
      EndIf
      
    EndIf
    
  Until Exit = #True
  
  ; Close and finish:
  CloseNetworkConnection(Con)
  FreeMemory(*Buffer)
  
  If Status<>0
    ProcedureReturn Status
  Else  
    ProcedureReturn *Buffer+Index
  EndIf

EndProcedure

;Demo
If InitNetwork() = 0
  Debug "No TCP provider..."
Else
  Result$ = PeekS(HTTP_GET("http://s242132022.onlinehome.fr/Download/PureBasic/demo.txt"))
  Debug Result$
EndIf
Résultat
Ligne0
Ligne1
Ligne2
Ligne3
Ligne4
Ligne5
Ligne6
Ligne7
Ligne8
Ligne9
Parfois le résultat est nul. A mon avis tu dois prévoir dans ce cas à une nouvelle lecture.


Et enfin le code avec intégration dans un EditorGadget. (N'oublies pas d'enlever la demo dans le fichier include)
Demo.pb

Code : Tout sélectionner

IncludeFile "HTTP_GET_Memory.pbi"

Enumeration
  #Mainform
  #Editor
EndEnumeration

Define.l Event, GEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Procedure Open_MainForm()
  Protected Result.s
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
  EditorGadget(#Editor, 10, 10, 400, 350)
  
  InitNetwork()
  Result = PeekS(HTTP_GET("http://s242132022.onlinehome.fr/Download/PureBasic/demo.txt")) 
  AddGadgetItem(#Editor, -1, Result)
  
EndProcedure

Open_MainForm()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Lecture d'un fichier texte sur serveur

Message par GallyHC »

Bonjour,

Avec le code de "falsam" pour le téléchargement, voila une petite routine pour analysé les ligne :).

Code : Tout sélectionner

  Define.i i, j
  Define stemps.s
  Define sresult.s = PeekS(HTTP_GET("http://s242132022.onlinehome.fr/Download/PureBasic/demo.txt")) 
  
  j = CountString(sresult, #LF$)
  For i=1 To j
    stemps = #NULL$
    stemps = StringField(sresult, i, #LF$)
    stemps = RemoveString(stemps, #CR$, #PB_String_NoCase)
    Debug stemps
  Next i
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Lecture d'un fichier texte sur serveur

Message par Backup »

je ne comprends pas la difference entre le code que Falsam donne (loong comme le bras )

et celui -ci :

Code : Tout sélectionner

;récupere un fichier sur un site
; c'est la base d'un aspirateur de site ;o)
; Purebasic 4.20 et +++²
InitNetwork()
If ReceiveHTTPFile("http://forums.purebasic.com/english/index.php", "E:\robots.txt")  ; fonctionne
	Debug "Succes"
	Else
	Debug "Erreur"
EndIf; EPB
??? utiliser la Methode Get apporte quoi ?
Répondre