Demande d'aide avec la lecture de fichier JSON

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Bonsoir,
Peut-être l'as-tu déjà fait et en rapport avec nos précédents échanges, il te reste maintenant à implémenter l'alimentation de ta BDD dans ta boucle de lecture des données.
C'est la phase suivante prévue, mais pour l'instant, je travaille encore sur l'amélioration du code qui lit les informations de la playlist pour créer la NewList Chaines.INFOSCHAINE() afin si possible d'augmenter la rapidité de lecture.
Pour l'instant, je télécharge la playlist en mémoire, puis je l'enregistre dans un fichier sur disque.
Ensuite, je lis ce fichier ligne a ligne pour en tirer les informations.
Je me posais la question de comment éviter l'écriture de la playlist sur disque pour la gérer directement en mémoire.

Il faut aussi que je modifie l'expression régulière regex_nulle car elle ne fonctionne pas comme attendue.
Edit: expression régulière modifiée, code mis à jour.

J'ai inclus la lecture JSON ainsi que la création de la BD pour Freebox dans mon application 'iptv'
J'ai encore du travail devant moi pour parvenir a l'objectif que je me suis fixé.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Code optimisé et corrigé, regex modifiée.
Code mis à jour dans le post.
Résultat de l'analyse:
Image
17 secondes pour analyser plus de 400.000 lignes sur un vieux Intel Celeron N2920, je m'en sort pas trop mal.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Demande d'aide avec la lecture de fichier JSON

Message par boddhi »

cage a écrit : Je me posais la question de comment éviter l'écriture de la playlist sur disque pour la gérer directement en mémoire.
Une solution comme une autre :

Code : Tout sélectionner

Define.s SourceHTTPM3U="http://pbcage.free.fr/files/playlist.m3u",ChaineM3U,LigneM3U
Define *TamponM3U

*TamponM3U=ReceiveHTTPMemory(SourceHTTPM3U)
If *TamponM3U
  Debug "Réception M3U réussie"
  ChaineM3U=PeekS(*TamponM3U,MemorySize(*TamponM3U),#PB_UTF8|#PB_ByteLength)
  FreeMemory(*TamponM3U)
  While ChaineM3U
    LigneM3U=StringField(ChaineM3U,1,#LF$)
    Debug LigneM3U
    ChaineM3U=Mid(ChaineM3U,Len(LigneM3U)+2)
  Wend
Else
  Debug "Échec réception M3U"
EndIf
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

J'étais arrivé a une solution identique mais qui n'est pas satisfaisante.
En tout premier lieu, elle est vraiment très lente sur des playlists importantes et il y a une désynchronisation de la lecture que je ne m'explique pas.
J'ai abusé du mode pas a pas de l'IDE sans succès.

J'avais en tête une approche similaire dont voici le code

Code : Tout sélectionner

EnableExplicit
Declare.s replaceAllString(string$,find$,replace$,flags=0)
Define IN, Taille, position, *MemoryID
Define.s ChaineM3U, LigneFichier
#PLAYLIST$ = ".\playlist-maroc.m3u"
IN=ReadFile(#PB_Any,#PLAYLIST$,#PB_UTF8)
If IN
  Taille = Lof(IN)
  *MemoryID = AllocateMemory(Taille)
  If *MemoryID
    If ReadData(IN, *MemoryID, Taille)
      ChaineM3U=PeekS(*MemoryID,Taille,#PB_UTF8|#PB_ByteLength)
      ; On retire les #CR$ de la chaine pour ne garder que les #LF$
      ChaineM3U=replaceAllString(ChaineM3U,#CR$,#Empty$)
      Debug "Taille : "+RSet(Str(Taille),9,"0")+" (chaine initiale)"
      Debug "Taille : "+RSet(Str(Len(ChaineM3U)),9,"0")+" (chaine modifiée)"
      Debug "Taille : "+RSet(Str(Taille-Len(ChaineM3U)),9,"0")+" (caractères retirés)"
    Else
      ChaineM3U=#Empty$
    EndIf
    FreeMemory(*MemoryID)
  EndIf
  CloseFile(IN)
EndIf

position=1

While ChaineM3U
  LigneFichier=StringField(ChaineM3U,position,#LF$)
  position+1
  Debug LigneFichier
Wend
End

Procedure.s replaceAllString(string$,find$,replace$,flags=0)
  Protected found=#False
  Debug "Nombre de chaines trouvées : "+CountString(string$, find$)
  While CountString(string$, find$) > 0
    string$ = ReplaceString(string$, find$, replace$, flags)
    found   = #True
  Wend
  Debug "Résultat : "+found
  ProcedureReturn string$
EndProcedure
Cette approche donne un résultat correct mais très lent.
Il n'y a pas d'erreur de lecture mais ça reste inutilisable.
Je ne vois pas pour l'instant d'autre possibilité de lire une chaine en mémoire pour gagner en vitesse.
Il manque une fonction ReadMemory() qui lirait la mémoire comme on a une fonction ReadFile()
Il faudrait aussi une fonction comme While Not Eof(#file) mais pour la mémoire.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Demande d'aide avec la lecture de fichier JSON

Message par cage »

Bonjour,

Une demande de Janni sur le forum anglais Fetching JSON value m'a permis de tester si j'avais bien appris ma leçon.
Il semble que oui.
Ça m'a aussi permis de comparer plusieurs façons de traiter les données a partir des mêmes datas.
Il faut que je me penche sur la commande ExtractJSONStructure() et voir ce qu'elle apporte.
cage
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Répondre