Modifier un csv en PHP

Eléphanteau du PHP | 23 Messages

22 juil. 2015, 15:23

Bonjour,

J'ai un script php qui me permet de transformer un fichier TXT transmis quotidiennement sur mon FTP au format CSV pour pouvoir mettre à jour ma base de données produits.
Dans ce fichier, J'ai plusieurs colonnes dont le texte est en majuscules, et je souhaiterais que seule la première lettre soit en majuscule et le reste en minuscule.
Plutôt que de modifier plusieurs fichiers PHP de mon site avec des ucfirst(strtolower($texte)), je souhaiterais que cela soit fait directement dans le script.
Est-ce possible ? Si oui, comment puis-je faire ?

Merci par avance pour votre aide.

Code : Tout sélectionner

<?php unlink("./data/updatedb.csv"); unlink("./data/stock.csv"); rename("./data/UPDATEDB.TXT", "./data/updatedb.csv"); $newfichier = fopen("./data/sortie_stock.csv", "w"); // crée le fichier cible s'il n'existe pas ou écrase s'il existe déjà fclose($newfichier); $lines = file('./data/updatedb.csv'); // ouverture du fichier d'origine $fp = fopen("./data/stock.csv","w"); //création du fichier de sortie $tampon = ""; // initialisation de la variable tampon foreach ($lines as $lineNumber => $lineContent) // boucle pour parcourir le fichier d'origine { if (strpos($lineContent,"#<SEPARATOR>#") !== false) // condition si la ligne contient séparateur { $tampon = $tampon . str_replace(CHR(13),"",$lineContent); // ajout du contenu de la ligne au tampon fputs($fp,$tampon); // écriture de la ligne tampon dans le fichier echo $tampon; // affiche à l'écran le résulat $tampon = ""; // clear du tampon }else{ // condition si ne contient pas de séparateur $tampon = $tampon . trim($lineContent); // alors ajoute le contenu au tampon déjà existant } } fclose($fp); // fermeture du fichier file_put_contents('./data/sortie_stock.csv', file_get_contents('./data/format.csv') . file_get_contents('./data/stock.csv') ); ?>

Mammouth du PHP | 688 Messages

22 juil. 2015, 15:46

$tampon = $tampon . str_replace(CHR(13),"",$lineContent);
$tampon = $tampon . trim($lineContent);

en remplaçant $lineContent, par l'appel de la fonction ucfirst

Eléphanteau du PHP | 23 Messages

22 juil. 2015, 16:01

$tampon = $tampon . str_replace(CHR(13),"",$lineContent);
$tampon = $tampon . trim($lineContent);

en remplaçant $lineContent, par l'appel de la fonction ucfirst
Merci pour cet élément de réponse.
Mais dans mon fichier CSV, j'ai une quarantaine de colonnes, et seulement une dizaine sur lesquelles je dois faire cette modification de texte.
Comment renseigner uniquement les colonnes concernées ?

Eléphant du PHP | 243 Messages

22 juil. 2015, 20:06

Mais dans mon fichier CSV, j'ai une quarantaine de colonnes, et seulement une dizaine sur lesquelles je dois faire cette modification de texte.
Comment renseigner uniquement les colonnes concernées ?
Bah il suffit de mettre une condition : Si la condition est respectée, alors on peut faire la modification.
Mais comment est organisé le fichier CSV ?
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Eléphanteau du PHP | 23 Messages

23 juil. 2015, 09:13

Mais dans mon fichier CSV, j'ai une quarantaine de colonnes, et seulement une dizaine sur lesquelles je dois faire cette modification de texte.
Comment renseigner uniquement les colonnes concernées ?
Bah il suffit de mettre une condition : Si la condition est respectée, alors on peut faire la modification.
Mais comment est organisé le fichier CSV ?
Mon fichier CSV contient des colonnes remplie de A à AN.
Les colonnes qui doivent être modifiées sont les colonnes M, N, P, R, S

De plus, en colonne K, j'ai des dates qui sont au format AAAAMMJJ et je souhaiterais qu'elles soient transformées au format JJ/MM/AAAA

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juil. 2015, 09:30

Bonjour,

Dans ta boucle, lorsque tu créer ta variable $tampon avec le contenu de la ligne à copier, tu peux faire un explode() de celle-ci sur le séparateur d'enregistrements (à priori le point-virgule pour un fichier csv). Tu obtiens ainsi un tableau donc chaque cellule correspondra à l'une de tes colonnes.

Il ne te reste plus qu'a effectuer tes modifications (mise en capitales, changement de format de date, ...) sur les index des cellules correspondante (A = 0; B = 1; ...) puis à tout remettre en forme avec un implode() et ajouter ta ligne modifiée dans ton fichier cible :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 23 Messages

23 juil. 2015, 13:35

J'ai réussi à modifier l'intégralité du fichier.
Cependant, j'ai un souci au niveau de la conversion de date (de AAAAMMJJ vers JJ MM(sous forme de texte complet = juillet) AAAA

J'ai écrit cette portion de code, mais dans mon fichier CSV, il s'affiche 02-févr-15 au lieu de 02 février 2015.

Code : Tout sélectionner

setlocale(LC_TIME, "fr_FR"); $uc_10 = $arr_base[10]; $date = strftime('%d %B %Y', strtotime($uc_10)); $tampon = str_replace($uc_10,$date,$tampon);

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 juil. 2015, 14:54

Comment contrôles-tu la valeur présente dans ton fichier ? Est-ce que tu ouvres celui-ci dans un bloc note ou est-ce que tu ouvres celui-ci avec Excel ?
Excel remet en forme automatiquement les dates, nombres, etc. pour les afficher à l'écran. Si tu ouvres ton fichier csv via le bloc note (ou tout autre éditeur de texte), tu verras le véritable format de ta date dans le fichier.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 23 Messages

23 juil. 2015, 15:32

J'ai ouvert le fichier via le bloc note. Pourtant la valeur %B devrait me mettre le mois en entier et non en abrégé.

Eléphanteau du PHP | 23 Messages

24 juil. 2015, 14:35

Problème résolu, en remplaçant les ' du strftime par des "

Une dernière question avant de mettre le sujet en résolu.
Je souhaite que le tampon soit écrit dans le fichier, il y ait un tri croissant sur la colonne "date" afin que la date la plus récente soit à la fin du fichier.

Merci par avance pour votre aide.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 juil. 2015, 18:50

salut,

pour cela il va falloir que tu récupère d'abord les données dans un tableau pour utiliser array_multisort et ensuite insérer dans le nouveau fichier.

pour info il existe des fonctions php pour lire et écrire du csv simplement fgetcsv, fputcsv, str_getcsv.
Tu peux aussi utiliser SplFileObject.
Ecriture
lecture (ou simplement avec un foreach sur l'objet (deuxième exemple de la doc).

@+
Il en faut peu pour être heureux ......