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 PHP Discussion :

Import de fichier ICS : des espaces sont supprimés


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Points : 19
    Points
    19
    Par défaut Import de fichier ICS : des espaces sont supprimés
    Bonjour,

    Je viens avec un souci pour lequel je n'ai trouvé de solution ni sur le Github du propriétaire du parser (envoi de mail avec explication il y a deux mois).

    J'utilise donc un parser un fichier ICS et l'enregistrer dans une base de données : https://github.com/MartinThoma/ics-parser à l'aide d'une commande CRON.

    Jusque là, le parser actuel me donnait un bon résultat sauf... que lorsque le fichier ICS contient des descriptions, et qu'il y a un retour à la ligne dans ces descriptions (retours à la ligne obligés dans le fichier même et non un retour à la ligne voulu dans le texte, cf capture d'écran d'un fichier exemple), l'espace entre les deux mots avant et après à la ligne est carrément supprimé, ici, l'espace entre "it was" et "decided" est supprimé.Nom : Capture d'écran 2024-07-21 184633.png
Affichages : 100
Taille : 31,8 Ko
    J'utilise un subterfuge en mettant un espace en plus entre les deux mots dans mon texte mais bien sur, cela se reproduit plus loin.... donc besoin d'éditer le fichier pas mal de fois. Et quand la description est longue, disons que c'est assez.... long !

    Sur le github parser actuel, j'ai trouvé une "issue" où le bug est déjà révélé et une solution donnée :https://github.com/MartinThoma/ics-parser/issues/4
    Le fait de commenter la ligne 65 du fichier class.iCalReader.php ne résoud rien, au contraire, cela en rajoute... et changer "trim" par ltrim ou rtrim non plus.
    On parle également d'erreurs dans ce même fichier.

    Depuis deux jours, j'essaye un autre parser, https://www.a2zwebhelp.com/import-data-from-ics un peu plus récent, mais j'obtiens les mêmes résultats....

    Mon texte ne comporte que des balises <p> et </p> ajoutées par l'application du gestionnaire de sport que nous utilisons et le fichier .ics fourni ne comporte aucun autre caractère HTML d'espacement. Donc pas un souci de texte encodé, meme avec du simple Lorem Ipsum copié en texte brut, cela le fait aussi
    Pour le mettre en base de données, j'utilise, comme donné dans les parsers, la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $connect->real_escape_string($data['DESCRIPTION'])
    pour passer le code HTML dans le champs de la colonne DESCRIPTION.
    J'utilise aussi le codage UTF8_bin dans ma base et dans le fichier PHP.

    Un exemple concret :
    Nom : Capture d'écran 2024-07-21 203112.png
Affichages : 91
Taille : 73,7 Ko
    Ici, les mots "Le Comité" ainsi que l'espace après la virgule en fin de texte "rencontrer,je" sont séparés d'un espace puis d'un retour à la ligne, et collés, espace supprimé donc, dans la BDD, ainsi que sur la page bien sur.
    tous les fichiers ICS ont ce retour à la ligne après x caractères.

    Connaissez-vous d'autres parsers ICS => Mysql/PHP ?
    Qui pourrait me solutionner cet énervant souci d'espaces bouffés par les parsers à chaque retour à la ligne du fichier ?

    Merci de votre aide !

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 892
    Points : 6 640
    Points
    6 640
    Par défaut
    Hélas le problème ne vient pas des parsers qui font correctement leur travail mais des fichiers que tu lui soumets qui ne sont pas conformes. Dans la RFC 5545 qui décrit le format iCalendar, on a bien:
    3.1. Content Lines

    The iCalendar object is organized into individual lines of text,
    called content lines. Content lines are delimited by a line break,
    which is a CRLF sequence (CR character followed by LF character).

    Lines of text SHOULD NOT be longer than 75 octets, excluding the line
    break. Long content lines SHOULD be split into a multiple line
    representations using a line "folding" technique. That is, a long
    line can be split between any two characters by inserting a CRLF
    immediately followed by a single linear white-space character (i.e.,
    SPACE or HTAB). Any sequence of CRLF followed immediately by a
    single linear white-space character is ignored (i.e., removed) when
    processing the content type.

    For example, the line:

    DESCRIPTION:This is a long description that exists on a long line.
    Can be represented as:

    DESCRIPTION:This is a lo
     ng description
      that exists on a long line.
    The process of moving from this folded multiple-line representation
    to its single-line representation is called "unfolding". Unfolding
    is accomplished by removing the CRLF and the linear white-space
    character that immediately follows.
    Note l'espace unique devant "ng description" et par contre les deux espaces devant "that exists".

    Donc pour reprendre l'exemple de wikipédia, celui-ci devrait être comme ceci:
    DESCRIPTION:Project xyz Review Meeting Minutes\n
     Agenda\n1. Review of project version 1.0 requirements.\n2.
      Definition of project processes.\n3. Review of project schedule.\n
     Participants: John Smith, Jane Doe, Jim Dandy\n-It was
      decided that the requirements need to be signed off by
      product marketing.\n-Project processes were accepted.\n
     -Project schedule needs to account for scheduled holidays
      and employee vacation time. Check with HR for specific
      dates.\n-New schedule will be distributed by Friday.\n-
     Next weeks meeting is cancelled. No meeting until 3/23.
    La meilleure option qui s'offre à toi est de trouver pourquoi ces fichiers ne sont pas conformes et de solutionner le problème en amont. À défaut, tout ce que tu peux faire c'est de les corriger à la main.
    Vient ensuite la solution mi-figue mi-raisin consistant à faire ton propre parser (ou à en éditer un existant) de manière à remplacer toutes les séquences CR + LF + ESPACE par un espace (au lieu de les supprimer). Ça peut-être intéressant si tes fichiers ne comportent jamais de mots coupés, dans le cas contraire tu auras troqué un mal pour un autre.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre à l'essai
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    Merci de me confirmer que le fichier ne respecte pas la norme, je l’ai déjà fait remonter mais bien entendu, de leur côté, tout est bon vu que ça fonctionne, enfin, ça affiche les balises html dans le calendrier sur iOS ou android…

    La deuxième solution est plus à envisager, ce que j’ai déjà fait, vu qu’ils ne veulent pas modifier leur système.

    De plus, je n'ai jamais de mots coupés vu que les textes sont encodés par moi-même.

    J’ai déjà tenté d’éditer le parser actuel, qui me semble plus facile à comprendre que le second (plus récent), avec les solutions données dans les liens précédents, en modifiant moi-même les lignes 65 et 171 du fichier class.icallreader.php

    Sans succès, je ne vois pas où se situe la correction, quand je corrige, j’ai d’autres erreurs , ou je m’y prends mal.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 892
    Points : 6 640
    Points
    6 640
    Par défaut
    Pour ce qui est du parser, laisse tomber celui de MartinThoma (ce projet ne semble pas avoir abouti et est abandonné depuis 13 ans). L'autre que tu as essayé ne me semble pas mieux avec ses 10 ans d'age et son code de démo daté.

    Si tu veux un autre parser, prends plutôt celui de Jonathan Goode: dernière màj le mois dernier, actif depuis 7 ans, 46 contributeurs, plus de 2700 lignes de code, et un README détaillé. J'ai juste regardé le code et je ne l'ai pas testé, mais il me fait bien meilleure impression.(*)

    Si le résultat reste le même, et que c'est le format des fichiers qui pose problème, tu peux tenter de les transformer avant de les soumettre au parser pour ajouter un espace au début de certaines lignes du texte de la propriété "DESCRIPTION".

    Voici un code pour le faire:
    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
    20
    21
    22
    23
    24
    $descPattern = <<<'REGEX'
    ~(*ANYCRLF)(*BSR_ANYCRLF)  # conventions nouvelle ligne et alias \R : \r\n, \r ou \n
        ^ DESCRIPTION                               # nom de propriété en début de ligne
        (?> ; [A-Z]+ = (?: " [^"]* " | [^;:]+ ) )*  # éventuelles options
        : \K                                        # on préserve tout jusqu'aux deux-points
        (?> .* \R? )*?                              # on prend les lignes de texte
        (?= ^ [A-Z]+ [;:] )                         # jusqu'à la propriété suivante
    ~xm
    REGEX;
     
    $linesPattern = <<<'REGEX'
    ~(*ANYCRLF)(*BSR_ANYCRLF)
        $                # fin de ligne
        (?<! \\ n | - )  # non-précédée par un antislash "n" ou par un tiret
        \R \h \K         # nouvelle ligne et espace horizontal (on préserve)
        (?! \h )         # non-suivis d'un autre espace horizontal
    ~xm
    REGEX;
     
    $string = preg_replace_callback(
        $descPattern, 
        fn($m) => preg_replace($linesPattern, ' ', $m[0]),
        $string
    );
    demo
    $string désigne ici une chaîne contenant tout le fichier ICS (chargé avec file_get_contents). Note que le parser peut charger soit le fichier via une URL, soit son contenu via une chaîne.


    Pour ce qui est de l'encodage de ta table MySQL, plutôt que utf8_bin, je te conseille utf8mb4 avec utf8mb4_0900_ai_ci pour la collation.

    (*) D'ailleurs dans son README, il ressort en creux qu'une certaine anarchie gravite autour de ce format avec d'un coté des acteurs pratiquant une libre interprétation et en demande d'évolution, et d'un autre des RFCs peu fréquentes.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre à l'essai
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    J’ai vu ce parser, mais, il y a un mais, je ne peux ajouter composer sur mon hébergement, je n’ai pas accès au SSH (offre perso chez OVH).

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 892
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 892
    Points : 6 640
    Points
    6 640
    Par défaut
    Tu peux passer outre ce problème en faisant l'install avec composer sur ton serveur local, puis transférer les fichiers obtenus sur ton hébergement en ftp.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre à l'essai
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 30
    Points : 19
    Points
    19
    Par défaut
    J'ai donc installé Composer avec XAMPP, et trouvé les fichiers dans le répertoire C:\xampp\phpMyAdmin\vendor
    Nom : Capture d’écran 2024-07-23 122425.jpg
Affichages : 46
Taille : 94,4 Ko
    Sur le serveur test, j'ai renvoyé le nouveau parser dans un dossier "ics-parser-master2" et envoyé le dossier vendor/ sur le serveur. Je suppose que c'est le bon dossier.

    Quand j'appelle le fichier examples/index.php comme décrit dans le readme; j'obtiens un code erreur 500.... avec les deux lignes pour obtenir les erreurs PHP, voici ce que j'obtiens : une classe non trouvée..
    Fatal error: Uncaught Error: Class "ICal\ICal" not found in /home/olimagv/www/ics-parser-master2/ics-parser-master/examples/index.php:10 Stack trace: #0 {main} thrown in /home/olimagv/www/ics-parser-master2/ics-parser-master/examples/index.php on line 10


    Quand à ton code pour transformer le calendrier avant de l'envoyer au parser, je n'arrive pas à l'implémenter correctement C'est un flux direct fourni par l'application.

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/04/2008, 13h38
  2. Problème de chemin de fichier avec des espaces
    Par Akronyme dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 11/12/2006, 17h12
  3. Import avec fichier contenant des guillemets
    Par Maximus06 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/07/2006, 12h07
  4. Renommer des fichiers contenant des espaces
    Par MatRem dans le forum Linux
    Réponses: 6
    Dernier message: 28/04/2006, 08h21
  5. Réponses: 2
    Dernier message: 26/02/2003, 15h18

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