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 :

preg_replace pour remplacer dernier caractère d'une ligne de fichier texte [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : consultant environnement et développement d'applications de base de données
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 336
    Points : 166
    Points
    166
    Par défaut preg_replace pour remplacer dernier caractère d'une ligne de fichier texte
    Bonjour

    Je génère un fichier texte avec des séparations par ; et des "" entre les champs textes que je veux importer dans une base MySQL par un LOAD DATA INFILE. Cela fonctionne correctement lorsque je mets des \N à la place des valeurs nulles mais je voudrai faire cela en php une fois le fichier texte envoyé vers le serveur.
    j'arrive presque à mon résultat avec une "bête" méthode du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $texte = file_get_contents($file);
    $texte = str_replace(";;;;;;;;;;;",";\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;",$texte);
            ....
    $texte = str_replace(";;",";\N;",$texte);
    file_put_contents($file , $texte);
    cela me remplace bien toutes les occurrences de ;; par ;\N; mais le souci se présente lorsque j'ai un champs nul en fin de ligne puisque le
    ligne1 "valeur a";;;
    devient
    ligne2 "valeur b";\N;\N;
    il manque donc un ;\N à la fin de la ligne...
    du coup, j'essaye de le faire avec une expression régulière et preg_replace. j'ai réussi sous Notepad++ avec le pattern ;$ et le remplacement ;\N mais ça ne marche pas en php si je fais à la fin de mon script précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace('%;$%',';\N',$texte);
    avez-vous une idée pour faire cela proprement ?
    Merci par avance

    Guen

  2. #2
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : consultant environnement et développement d'applications de base de données
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 336
    Points : 166
    Points
    166
    Par défaut
    et bien..il suffisait que je pose la question sur le forum pour que je trouve ensuite (pourtant ça fait plus de 3 heures que je cherche en vain !!!) et ceci grâce à ce site qui m'a permis de tester et voir la façon dont c'était écrit en php: https://fr.functions-online.com/preg_replace.html
    il faut mettre le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $texte = preg_replace('/;\\r/',';\\N',$texte);
    si cela peut servir à qq un...
    bonne année 2017 !!!

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 899
    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 899
    Points : 6 674
    Points
    6 674
    Par défaut
    C'est bien vilain tout ça. Il semble que tu manipules un fichier csv, donc au lieu de faire des remplacements au kilo, utilise la structure csv et les fonctions associées (pour la lecture et l'écriture), puis remplace chaque champ vide:

    Je n'ai pas testé le code, mais l'idée est là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if ( false !== $fhs = fopen("source.csv", "r") and false !== $fhd = fopen("destination.csv", "w") ) {
        while ( false !== $data = fgetcsv($fhs, 1000, ";") ) {
            foreach ($data as &$v) {
                if (empty($v)) $v = '\N';
            }
            fputcsv($fhd, $data, ";");
        }
        fclose($fhs);
        fclose($fhd);
    }
    En procédant de cette manière, pas besoin de savoir où se trouvent les champs vides, ni combien il y en a. Autre avantage, le fichier source est lu au fur et à mesure, donc la mémoire n'est jamais chargée quelque soit la quantité de données.

    Attention en utilisant $texte = preg_replace('/;\\r/',';\\N',$texte); tu risques d'obtenir un fichier corrompu où la séquence de nouvelle ligne sera un coup CRLF, et un coup LF (quand il y a eu remplacement).

  4. #4
    Membre habitué
    Homme Profil pro
    consultant environnement et développement d'applications de base de données
    Inscrit en
    Janvier 2006
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : consultant environnement et développement d'applications de base de données
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2006
    Messages : 336
    Points : 166
    Points
    166
    Par défaut
    Effectivement, cela semble plus propre mais un rapide test me donne un fichier de destination qui enlève les " autour des champs texte mais en ajoute par contre autour des champs dates et des \N.
    juste un petit paramétrage peut-être...? Ceci dit, ma méthode est bien moins esthétique mais elle ne semble pas beaucoup plus lente et fonctionne.
    merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/09/2011, 11h04
  2. Récupérer les derniers caractères d'une ligne d'un fichier texte
    Par Laaris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/01/2009, 16h06
  3. Réponses: 4
    Dernier message: 14/11/2008, 21h00
  4. Réponses: 1
    Dernier message: 21/08/2007, 08h25

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