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 :

Remplacement texte fichier csv [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Remplacement texte fichier csv
    Bonjour,

    Je dispose d'un fichier CSV dont voici quelques lignes :
    "2012";"vu";;"11843.91";"1145.49";
    "2012";"vp";;"12388.03";"1791.23";"68.2"
    "2012";"vu";;"25296.55";"4609.22";
    "2012";"vp";;"19701.87";"3029.84";
    "2012";"vu";;"12816.46";"2429.13";
    "2012";"vp";;"14033.35";"1556.17";"200.02"
    "2012";"vu";;"7597.83";"6085.31";
    "2012";"vp";;"15468.23";"1316.53";"200"
    "2012";"vu";;"5894.66";"3145.27";
    "2012";"vp";;"11816.4";"2055.98";"770"
    ...

    Il y a, comme vous le voyez, toujours le même nombre de ";" (séparateur de champs), mais le nombre de données peut varier (deux ";" consécutifs quelques fois).

    Mon objectif est d'insérer le numéro du mois de façon automatique entre l'année et le champ qui suit, pour ainsi obtenir :
    "2012";"01";"vu";;"11843.91";"1145.49";
    "2012";"01";"vp";;"12388.03";"1791.23";"68.2"
    "2012";"02";"vu";;"25296.55";"4609.22";
    "2012";"02";"vp";;"19701.87";"3029.84";
    "2012";"03";"vu";;"12816.46";"2429.13";
    "2012";"03";"vp";;"14033.35";"1556.17";"200.02"
    "2012";"04";"vu";;"7597.83";"6085.31";
    "2012";"04";"vp";;"15468.23";"1316.53";"200"
    "2012";"05";"vu";;"5894.66";"3145.27";
    "2012";"05";"vp";;"11816.4";"2055.98";"770"
    ...

    Il faut donc répéter deux fois le même numéro de mois, puis l'incrémenter. Pour ça je sais faire, mais j'ai un problème avec les fonctions fgets, fputs au niveau des sauts de lignes... cela ne réécrit pas tout (coupure de la ligne suivante) ou alors cela saute trop de lignes... quelqu'un a une idée ?

    Voici mon code PHP :

    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
     
    <?php
    // ...
    $adresse_fichier = $adresse_dossier.$fichier;
    if ($opened_file = fopen($adresse_fichier, 'r+')) {
        $mois = 1;
        $incrementer_mois = false;
        $search = '";"v';
        while (($ligne = fgets($opened_file)) !== false) {
            $replace = '";"'.$mois.'";"v';
            $nouvelle_ligne = str_replace($search, $replace, $ligne);
            if ($incrementer_mois === true) {
                $mois++;
            }
            $incrementer_mois = !$incrementer_mois;
            if ($mois === 13) {
                $mois = 1;
            }
            $taille_ligne = strlen($ligne);
            $pos_pointeur = ftell($opened_file) - $taille_ligne;
            fseek($opened_file, $pos_pointeur);
            fputs($opened_file, $nouvelle_ligne);
        }
    } else {
        echo 'Le fichier '.$fichier.' n\'a pas pu être ouvert';
    }
    // ...
    ?>
    Et voici ce que j'obtiens :
    "2012";"1";"vu";;"11843.91";"1145.49";
    2";"1";"vp";;"12388.03";"1791.23";"68.2"
    2";"2";"vu";;"25296.55";"4609.22";
    2";"2";"vp";;"19701.87";"3029.84";
    2";"3";"vu";;"12816.46";"2429.13";
    2";"3";"vp";;"14033.35";"1556.17";"200.02"
    2";"4";"vu";;"7597.83";"6085.31";
    2";"4";"vp";;"15468.23";"1316.53";"200"
    2";"5";"vu";;"5894.66";"3145.27";
    2";"5";"vp";;"11816.4";"2055.98";"770"
    ...

    Il y a donc 4 caractères du début de chaque ligne qui sont "effacés"... (sauf pour la 1ère ligne où ça fonctionne)

    Merci.

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Il suffit de parcourir ton CSV actuel et le reconstituer :

    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
     
    $lines = file('fichier.csv');
    $newcsv = '';
    $sep = ';';
    $newline = "\r\n";
     
    foreach($lines as $i => $line){
        $csv = explode($sep, $line);    
        $newcsvline = array(    
            $csv[0],
            $i % 2 === 0 ? '1' : '2',
            $csv[1],
            $csv[2],
            $csv[3],
            $csv[4],
            $csv[5]
        );
     
        $newcsv .= implode($sep, $newcsvline) . $newline;
    }
     
    var_dump($newcsv);
    Ensuite tu n'as plus qu'à remplacer le contenu de ton fichier par $newcsv

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse ! J'ai réussi.

    Voici le code adapté pour ceux qui souhaitent :

    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
     
    <?php
    //...
    $lines = file($adresse_fichier);
    $newcsv = '';
    $sep = ';';
    $newline = "\r\n";
    $mois = 1;
    foreach ($lines as $i => $line) {
    	$csv = explode($sep, $line);    
    	$newcsvline = array(    
    		$csv[0],
    		$i % 2 === 0 ? '"'.$mois.'"' : '"'.$mois++.'"',
    		$csv[1],
    		$csv[2],
    		$csv[3],
    		$csv[4],
    		$csv[5]
    	);
    	$newcsv .= implode($sep, $newcsvline);
    	if ($mois === 13) {
    		$mois = 1;
    	}
    }
    if ($opened_file = fopen($adresse_fichier, 'w')) {
    	fwrite($opened_file, $newcsv);
    } else {
    	echo 'Le fichier '.$fichier.' n\'a pas pu être ouvert';
    }
    //...
    ?>

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

Discussions similaires

  1. Problème transfert fichier texte fichier .csv
    Par stansoad0108 dans le forum Langage
    Réponses: 14
    Dernier message: 09/03/2012, 10h30
  2. XML à fichier text ou csv : mise à plat
    Par fgachet dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 18/02/2009, 11h23
  3. Remplacer des donnees dans un fichier csv
    Par pitchalov dans le forum VBScript
    Réponses: 1
    Dernier message: 16/07/2008, 16h44
  4. Réponses: 1
    Dernier message: 15/11/2007, 13h52
  5. remplace contenu fichier texte
    Par schumi101 dans le forum C
    Réponses: 20
    Dernier message: 23/06/2006, 15h49

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