IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Traiter Json / Séparation de ligne


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut Traiter Json / Séparation de ligne
    Bonjour,
    Comme suite au sujet https://www.developpez.net/forums/d2...er-array-json/ sur lequel je n'ai pas voulu me greffer.

    Le format des fichiers Json a plusieurs versions au niveau des fins de ligne. Je rencontre notamment :
    Nom : CRLF.png
Affichages : 371
Taille : 7,8 Ko
    et
    Nom : LF.png
Affichages : 348
Taille : 5,1 Ko

    Avec mon code de lecture du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function LoadFileToStr(const FileName: TFileName): String;
    var
      FileStream: TFileStream;
      Bytes:      TBytes;
     
    begin
      Result := '';
      FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
      try
        if FileStream.Size > 0 then
        begin
          SetLength(Bytes, FileStream.Size);
          FileStream.Read(Bytes[0], FileStream.Size);
        end;
        Result := TEncoding.ANSI.GetString(Bytes);
      finally
        FileStream.Free;
      end;
    end;
    Le CR+LF déclenche une exception mais pas le LF seul.

    J'ai trouvé plusieurs solutions plus ou moins complètes pour retrouver un format adéquat et constant.
    Existe-t-il un moyen efficace et simple de résoudre ce problème ?

    Belle journée à tous ...

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 649
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 649
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    la question que je me pose ce n'est pas tant que le format ait deux types LF ou CR LF mais pourquoi le lire dans un Stream ?
    as-tu essayé ClientDataset, a moins que ce ne soit pas un fichier lisible par ce composant ?
    Cela étant la version de Delphi à surement un rôle prépondérant

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Pourquoi ne pas laisser ParseJSONValue lire directement le TBytes ?
    ANSI comme encoding me choque, le fichier est en Windows1252 ce n'est pas très multi-plateforme et donc si il y a du LF et CRLF, j'utiliserais UTF8.
    Pas de BOM ?


    ClientDataset déconne déjà avec le XML selon les versions, surtout en 64Bits de D10 ... et le format c'est la structure MIDAS pas une structure libre.
    Ce n'est pas plutôt FireDAC qui a un connecteur JSON
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Hello

    Tu devrais remplacer ton truc par Toile.ReadAllText() de System.IOUTils

    Pour l'interprétation du JSON, par quoi passes-tu ? System.JSON et donc son parking ou une autre librairie ?

  5. #5
    Membre très actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Par défaut
    L'encodage et le séparateur de ligne peuvent être réglé aisément avec TStringList .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function LoadFileToStr(const FileName: TFileName): String;
    begin
      with TStringList.Create do
      try
        LoadFromFile(FileName);
        LineBreak:=#10;
        Result:= Text; 
      finally
        Free;
      end;
    end;

  6. #6
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Bonjour,

    @Wheel : Merci, ta solution fonctionne parfaitement

    @PPrem :
    Pour l'interprétation du JSON, par quoi passes-tu ? System.JSON et donc son parking ou une autre librairie ?
    Le traitement est, pour mes premiers essais, fait par un TJsonTextReader qui fait son job.

    @ShaiLeTroll :
    ANSI comme encoding me choque, le fichier est en Windows1252 ce n'est pas très multi-plateforme et donc si il y a du LF et CRLF, j'utiliserais UTF8.
    UTF8 est probablement le meilleur Encoding mais il me retourne la même exception.

    @SergioMaster :
    as-tu essayé ClientDataset, a moins que ce ne soit pas un fichier lisible par ce composant ?
    Comme je suis noob en base de données (Il faudrait que je m'y attelle sérieusement ...), je ne connais pas assez ses composants. J'ai commencé à aller voir du côté des Tutos mais je manque sérieusement de temps

    Merci à tous les 4 pour ces pistes. Je vais commencer par appliquer celle de Wheel pour avancer sur les autres points. Je vais tout de même tenter de mettre un ClientDataSet sur ma fiche pour voir le résultat...
    Bon WE et belle journée...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2011, 16h09
  2. [3.2] [Excel ou MySQL] traiter un nombre de ligne puis bouclé si condition
    Par slimlus dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 08/11/2010, 23h43
  3. Talend : mémoire insuffisante pour traiter 7 millions de lignes
    Par Edna24 dans le forum Exécution et industrialisation
    Réponses: 9
    Dernier message: 11/06/2009, 13h42
  4. [Tableaux] Textarea : séparation des lignes
    Par micksing dans le forum Langage
    Réponses: 8
    Dernier message: 25/07/2007, 16h57
  5. Ne pas traiter les x dernières lignes
    Par Fluxy dans le forum Windows
    Réponses: 3
    Dernier message: 13/06/2007, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo