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 :

Séparer des lignes avec un séparateur *


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Points : 244
    Points
    244
    Par défaut Séparer des lignes avec un séparateur *
    Bonjour,

    Je dois traiter des fichiers que je reçois.

    Ces fichiers contiennent différentes lignes.
    Chaque ligne contient différentes colonnes séparées par des *. Le nombre de colonne et la taille des colonnes varient toujours.
    chaque ligne se termine par un !.

    Je souhaite récupérer le contenu des différentes colonnes.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A1*12*ABC-TYU 4*ZABG-455-FDLKGO**--**AZ!
    Cela doit donner les colonnes :

    • A1
    • 12
    • ABC-TYU 4
    • ZABG-455-FDLKGO
    • (vide)
    • --
    • (vide)
    • AZ


    Le problème est que les colonnes peuvent contenir les caractères * ou !, dans ce cas, ils sont précédé d'un ?.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A1*13?!*DF4**AZ-KO-45*-4?*-9865*Z!
    dans ce cas, cela doit donner :

    • A1
    • 13?!
    • DF4
    • (vide)
    • AZ-KO-45
    • -4?*-9865
    • Z


    J'ai donc créé l'expression suivante :

    Le problème est que je ne sais pas comment prendre, dans les colonnes, les ! ou * avec un ? devant.

    Est-ce que quelqu'un serait comment gérer ça ?
    Merci de votre aide, je galère depuis le début d'après midi sur ce problème, je ne trouve pas comment faire.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Je ne fais pas mes compliments à l'auteur de ce format tordu. C'est proche du csv sans vraiment en être.

    Utiliser preg_split sera plus simple à mon avis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $str = 'A1*13?!*DF4**AZ-KO-45*-4?*-9865*Z!';
     
    $lines = preg_split('~(?<!\?)!~', $str);
     
    if ( empty(end($lines)) )
        array_pop($lines);
     
    foreach ($lines as $line) {
        $columns = preg_split('~(?<!\?)\*~', $line);
        print_r($columns);
    }
    Cela dit, la description de ton format est incomplète: Puisque ? est utilisé comme caractère d'échappement pour le séparateur de colonne * et le séparateur de ligne !, est-ce qu'il s'échappe lui-même? Auquel cas, par exemple AB??*CD donnerait deux colonnes AB? et CD, et non juste une AB??*CD.

  3. #3
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Points : 244
    Points
    244
    Par défaut
    Bonjour CosmoKnacki,

    En fait, j'aurais aimé géré ça avec juste une regex, sans autre fonction, si c'est possible.
    Je te confirme, qu'il s'agit bien d'un format tordu. C'est malheureusement un format de fichier EDI imposé par le client, donc...

    Ici, je cherche juste à récupérer les colonnes, les caractères échappés seront gérés plus tard, à l'étape suivante. Pas besoin de s'en occuper ici.

    Et oui, dans un colonne, si on doit utiliser un caractères *, ! ou ?, il sera précédé d'un ?.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Basiquement la description d'une colonne est ~[^?!*]* (?: \?. [^?!*]*)*~x, mais c'est loin de suffire si tu veux t'assurer de l'intégrité des données, car avec cette pattern seule, rien ne prouve par exemple que ta ligne ne se termine pas par un point d'interrogation,ce qui dérogerait à la syntaxe que tu m'as présentée, ou que la ligne ne contienne pas plusieurs points d'exclamation qui ne soient pas échappés.
    D'ailleurs à ce propos je me demande par quel miracle tu as pu séparer les lignes alors que ça représente exactement la même difficulté que pour séparer les colonnes?

    L'idéal serait que tu postes un extrait brut de ce que tu reçois contenant plusieurs lignes. Aussi il faudrait préciser si la fin du fichier se termine oui ou non par un point d'exclamation.

  5. #5
    Membre actif Avatar de oneDev
    Homme Profil pro
    dilettant
    Inscrit en
    Mars 2019
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : dilettant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2019
    Messages : 220
    Points : 244
    Points
    244
    Par défaut
    Ca a l'air pas mal, merci
    Je devrais pouvoir me débrouiller avec ça.

    Pour les contrôle de fin de ligne, c'est déjà fait, donc il n'y a pas de risque à ce niveau là.

Discussions similaires

  1. Comment lire des lignes avec un BinaryReader ?
    Par olibara dans le forum C#
    Réponses: 7
    Dernier message: 07/04/2008, 14h57
  2. [RegEx] Changer ordre des lignes avec SQL et PHP
    Par kifouillou dans le forum Langage
    Réponses: 16
    Dernier message: 20/03/2008, 17h27
  3. [Jlist] faire des lignes avec boutons
    Par matt22 dans le forum Composants
    Réponses: 1
    Dernier message: 27/11/2006, 17h21
  4. Comment changer les couleurs des lignes avec displaytag
    Par rlnd23 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/10/2006, 14h52
  5. [Requete] Comment ignorer des lignes avec un LOAD DATA
    Par frangin2003 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2005, 13h14

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