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 !

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.pbiCode : 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.pbCode : 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 ?