Page 1 sur 2

Lecture d'un fichier texte sur serveur (RESOLU)

Publié : mer. 21/août/2013 6:51
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.

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 7:05
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

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 7:42
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.





@++

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 9:54
par MetalOS
Récupérer le code avec le WebGadget je connaissais mais comment le traiter ensuite ? C'est là ou je bloque.

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 10:00
par Backup
....

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 12:06
par GallyHC
@Dobro
MetalOS a écrit :PS: Je suis sur Mac OS X donc l'utilisation d'API Windows ne marchera pas.
;)

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 18:10
par Backup
arf ! .. comme quoi MacOS n'est pas parfait ! :twisted:

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 18:46
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 ?

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 20:37
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 ...

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 21:06
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. :)





@++

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 21:50
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.

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 23:03
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

Re: Lecture d'un fichier texte sur serveur

Publié : mer. 21/août/2013 23:04
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

Re: Lecture d'un fichier texte sur serveur

Publié : jeu. 22/août/2013 8:50
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

Re: Lecture d'un fichier texte sur serveur

Publié : jeu. 22/août/2013 10:52
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 ?