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 :

str_replace sur un csv


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 108
    Points
    108
    Par défaut str_replace sur un csv
    Bonsoir,

    j'inserre avec LOAD DATA INFILE un fichier csv dans ma base, sauf que je dois reformater dans le tableur mes valeurs avant introduction : ni virgules, ni espaces ce qui m'amène à perdre en exactitude.

    Je cherche depuis longtemps à utiliser str_replace, et si j'y arrive sur une chaine de carractères, je n'y arrive pas sur un fichier de type csv, à moins d'utiliser une fonction BASH ce qui me semble lourd.

    Si quelqu'un peut m'orienter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		$filename = array("../../../fichier/efs.csv");
    		$efs_c = str_replace($filename, ".","");
    		$efs_cs = str_replace($filename, " ", "");
    		$efs_csv = str_replace($filename, ",", ".");
     
    // NE SERT PAS DEPUIS MON MSI (utile depuis les excels du TAF)--->>       LINES TERMINATED BY '\r\n'
    /* insertion */
    $requete1 = "LOAD DATA LOCAL INFILE '../../../fichier/efs.csv'  .....................
    Je dois d'abord remplacer les '.' par 'rien' les 'espaces' par 'rien' , enfin les ',' par des 'points' .

    Quelque chose m'échape ...
    Merci de vos avis

    nimbus

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    Une expression régulière serait sûrement plus efficace

    Code php non testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $myString = "klqjsdlkjq,asdqsd qmlksdm.
    qsdfqsf,fdqsfù";
    $pattern = "/[\s.,]/m";
    $myString = preg_replace($pattern, '', $myString);

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Cette syntaxe est incorrecte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $efs_c = str_replace($filename, ".", "");
    C'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $efs_c = str_replace(".", "", $filename);

  4. #4
    Membre régulier Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 108
    Points
    108
    Par défaut Vous avez raison ...
    et les possibilités sont effectives sur une chaine de caractère,

    Mais comme je le disais :
    Je cherche depuis longtemps à utiliser str_replace, et si j'y arrive sur une chaine de carractères, je n'y arrive pas sur un fichier de type csv .....
    [CODE]
    J'applique ce code après la réception du fichier sur la machine et avant l'insertion dans la base ...
    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
     
    // upload du fichier
    if(isset($_POST['inserer']))
    {
    	$content_dir= '../../../fichier/efs.csv' ;
    	$tmp_file = $_FILES['trans']['tmp_name'];
     
    	if( !is_uploaded_file($tmp_file) )
    		{
    		exit("le fichier est introuvable");
    		}
    	$type_file = $_FILES['trans']['type'];
     
    	if( !move_uploaded_file($tmp_file, $content_dir . $name_file ) )
    		{
    		exit("impossible de copier le fichier dans $content_dir");
    		}
    		$filename = "../../../fichier/efs.csv";
    // éviction des .
    $efs_c = str_replace(".", "", $filename);
     
    // Insertion dans la base
    $requete1 = "LOAD DATA LOCAL INFILE '../../../fichier/efs.csv' INTO TABLE `efs4` FIELDS ....//....
    Quelque chose m'échappe et de fait je ne peux le comprendre.

    Merci de vos orientations.

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Ce serait pas plutôt un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $efs_c = str_replace(".", "", file_get_contents($filename) );

  6. #6
    Membre régulier Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 108
    Points
    108
    Par défaut Pas mieux ...
    j'ai beau lire tous les tutoriels de la terre rien de change ...
    ( j'exagère un peu mais ça ne m'avance pas ...)


    Nimbus

  7. #7
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    C'est pas de cette manière que tu devrais travailler avec les fichiers,

    Si tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if file_exists($filename){
      $tmp_file = file_get_contents($filename);
      $tmp_file = str_replace('.','',$tmp_file);
      $tmp_file = str_replace(' ', '',$tmp_file);
      $tmp_file = str_replace(',', '.',$tmp_file);
     
      if(fopen($filename,'w')){
        fputs($filename,$tmp_file);
        fclose($filename);
      }
    }

  8. #8
    Membre régulier Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 108
    Points
    108
    Par défaut MERCI à tous
    A force de chercher j'ai fini par trouver.

    Vos remarques ont orientés mes (longues) recherche et cela fini tout 'simplement' ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $efs_c = str_replace(",", ".", file_get_contents($content_dir) ); 
    file_put_contents($content_dir, $efs_c);
    J'ai abandonné pour le moment la réduction des espaces,
    en effet il me faut apprendre à dire que je ne veux
    les réduire que dans les 10,11 et 12éme champs de chaque ligne ...

    Pour cela j'attendrai l'an neuf !

    J'ai gagné mon pari de commencer l'année avec des valeurs décimales réelles.

    Merci encore pour votre attention (et pas trop de folie ce soir )

  9. #9
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    salut,

    super ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_put_contents($content_dir, $efs_c);


    file_put_contents($content_dir, $efs_c);
    hum hum t'inquiètes pas !

  10. #10
    Membre régulier Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 108
    Points
    108
    Par défaut LOAD DATA INFILE, avec modification des champs numériques
    Et non :
    { !Voilà c'est réussi, je joint le script complet, il pourra surement servir à d'autres : }
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    //Controle du bon format de fichier
    $the_file_name = $_FILES['trans']['name'];
    $extension = substr ($the_file_name,-4);
            if($extension!= ".csv" )
                    {
                    echo"<div align='center'><br/><strong><font color='red'>ATTENTION le format du fichier charge n'est pas <font size='8'>.csv</font> !!! Il est en :<font size='8'>";
                    echo  $extension ;
                    echo "<br><br>RECOMMENCEZ ... </font></font></strong></div>";
                    exit ;
                    }
    // Upload du fichier
            if(isset($_POST['inserer']))
                    {
                            $content_dir= '../../../fichier/jour_trans.csv' ;
                            $tmp_file = $_FILES['trans']['tmp_name'];
     
                                    if( !is_uploaded_file($tmp_file) )
                                            {
                                            exit("le fichier est introuvable");
                                            }
                                            $type_file = $_FILES['trans']['type'];
     
                                    if( !move_uploaded_file($tmp_file, $content_dir . $name_file ) )
                                            {
                                            exit("impossible de copier le fichier dans $content_dir");
                                            }
                    }
     
    // Appropriation des droits
    if(chMod($content_dir, 0666))
     
    // suppression des espaces
    $efs = str_replace(" ", "", file_get_contents($content_dir) );
    file_put_contents($content_dir, $efs);
     
    //Remplacement des ',' en '.'
    $efs_c = str_replace(",", ".", file_get_contents($content_dir) );
    file_put_contents($content_dir, $efs_c);
     
    // Inserer les nouvelles valeurs
    $requete1 = "LOAD DATA LOCAL INFILE '../../../fichier/jour_trans.csv' INTO TABLE `base_jour` FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (
    Curieusement il ne remplace les espaces que dans les champs utiles, sans doute parce que ce sont les seuls champs numériques ayant des espaces,
    les espaces des champs texte sont préservés.

    Si si , il me les enlève partout ... pas bon du tout.

    Je regarde du côté des REGEX ... À BIENTÔT.

    Si quelqu'un a une explication technique je suis preneur.

    Merci à tous, et Bonne année.

    Nimbus

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Points : 29
    Points
    29
    Par défaut
    si je dis pas de connerie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // suppression des espaces
    $efs = str_replace(" ", "", file_get_contents($content_dir) );
    file_put_contents($content_dir, $efs);
     
    //Remplacement des ',' en '.'
    $efs_c = str_replace(",", ".", file_get_contents($content_dir) );
    file_put_contents($content_dir, $efs_c);
    Ca serait mieux comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $efs = str_replace(' ', '', file_get_contents($content_dir) );
    $efs = str_replace(',','.',$efs);
    file_put_contents($content_dir,$efs);
    Parce que 2 ouvertures de fichiers, plus 2 écritures sur le même fichier je vois pas trop l'intérêt.

    PS : les simples quotes réduisent le temps d'exécution du script par rapport à un double car ils ne sont pas évalués.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/03/2008, 06h56
  2. Ouverture CSV (DoubleClick sur un .csv)
    Par BenoitM dans le forum Excel
    Réponses: 1
    Dernier message: 07/12/2007, 12h53
  3. [CSV] str_replace et fichier CSV
    Par palmier dans le forum Langage
    Réponses: 2
    Dernier message: 19/06/2007, 15h38
  4. Ecriture sur fichier csv
    Par PIMPMAX dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 09/01/2007, 11h55

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