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 :

Détecter un retour à la ligne de type Mac ou PC


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut Détecter un retour à la ligne de type Mac ou PC
    Bonjour,

    Nous devons traiter des fichiers Excel parfois enregistrés sur Mac, par fois sur PC.

    Le retour à ligne est différent, il me semble n sur PC et r sur Mac.

    Cela pose bien sûr un problème.

    Voyez-vous un moyen de détecter le type de retour à la ligne, il me semble que strpos ne fonctionne pas pour ce type de caractère ?

    Merci d'avance.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 452
    Points : 43 103
    Points
    43 103
    Par défaut
    Fichiers au format .xls ? .csv ?

    De façon plus globale, sous Windows on utilise le CRLF (CR Carriage Return représenté par \r, et LF Line Feed représenté par \n). Sous Linux c'est LF : \n

    Le CSV termine les lignes par CRLF

    Tu peux tout simplement faire une normalisation avant traitement via str_replace en remplaçant "\r\n" par '\n", puis par sécurité "`\r" par "\n".
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    Ce sont des fichiers .csv.

    Ton idée de str_replace me semble très simple et très bonne.

    Je teste pendant le week-end et vous tiens au courant.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    J'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $tab = file ($tableauExcelEnCsv, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
     
    function PcMac ($v)
    {
    return str_replace (array ("\r\n", "\r"), "\n", $v);
    }
     
    $tab = array_map ('PcMac', $tab);
     
    if (count ($tab) == 1) $tab = explode ("\n", $tab[0]);
    Cela semble fonctionner, j'ai testé avec le même fichier enregistré en CSV Mac et CSV Windows.

    Je suis un peu paumé avec ces trucs, ce que je comprends.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Si $tableauExcelEnCsv est Windows, file () renvoie un bon tableau avec les éléments séparés par ;
     
    $tab = array (0 => a;b;c, 1 => e;f;g, 2=> h;i;j);
     
    // Si $tableauExcelEnCsv est Mac, file () renvoie un tableau à un seul élément avec "\r" en retour à la ligne :
     
    $tab = array (
    0 =>
    a;b;c
    e;f;g
    h;i;j
    );
    Du coup il me semble que l'on peut un peu changer mon code qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $tab = file ($tableauExcelEnCsv, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
     
    if (count ($tab) == 1)
    {
    function PcMac ($v)
    {
    return str_replace (array ("\r\n", "\r"), "\n", $v);
    }
     
    $tab = array_map ('PcMac', $tab);
    $tab = explode ("\n", $tab[0]);
    }

    Je ne le fais pas ton cela est dans des fonctions et que la mise à jour des scripts est plus rapide si j'applique la fonction PcMac dans une fonction amont, avant de tester le nombre d'éléments.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 676
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    En allant plus loin, le str_replace n'est nécessaire que pour les fichiers Mac et ces derniers se détectent car ils sont un tableau à un seul élément.

    Le code peut donc être réduit à deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $tab = file ($tableauExcelEnCsv, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
     
    if (count ($tab) == 1) $tab = explode ("\n", str_replace (array ("\r\n", "\r"), "\n", $tab[0]));
    Trois remarques :

    1) Si $tab est un fichier PC avec un seul élément, on le récupère à l'identique après str_replace et explode.

    2) Le traitement de $tab dans la suite du script est très facile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (list (, $v) = each ($tab))
    {
    $vv = explode (';', $v);
    }
    3) Le même code doit marcher avec un fichier Excel en .txt, il suffit juste remplacer ';' par "\t" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (list (, $v) = each ($tab))
    {
    $vv = explode ("\t", $v);
    }
    Voilà donc une façon simple de traiter les fichiers Excel sans se soucier de leur provenance (sauf erreur...).

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Si ton problème vient du fait que PHP ne reconnais pas les nouvelles lignes sur les fichiers enregistré sous mac quand tu utilises des fonctions comme fgetcsv il suffit d'activer la directive auto_detect_line_endings dans ton php.ini
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [PHPMAILER] Détecter les retours à la ligne
    Par beegees dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/04/2014, 23h18
  2. Réponses: 7
    Dernier message: 27/10/2011, 17h27
  3. Détecter le retour à la ligne dans une cellule multiligne
    Par justgreat dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/10/2010, 17h26
  4. Détecter un retour à la ligne
    Par omelhor dans le forum Langage
    Réponses: 1
    Dernier message: 09/11/2009, 08h51
  5. Retour à la ligne dans un champ de type text
    Par Dsphinx dans le forum Outils
    Réponses: 8
    Dernier message: 18/07/2007, 10h45

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