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 :

[CSV] supprimer la première ligne d'un fichier


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut [CSV] supprimer la première ligne d'un fichier
    Comment faire pour ne supprimer que la première ligne d'un fichier, et garder le reste sous la mème forme.
    Le fichier est un fichier CSV, j'aimerais qu'il reste formater de la mème façon.
    Je n'ai pas trouvé comment faire, si quelqu'un pouvait m'aider, me donner une piste.

    Merci d'avance

  2. #2
    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
    Que fais-tu avec le reste, une importation dans une table ?

  3. #3
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Je n'ai pas essayé mais je te donne une idée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $file;// Ta variable qui contient le texte du fichier
    $pos = strpos($file, "\n");
    $resultat = substr($file, $pos, strlen($file));
    Dans la mesure ou ton fichier CSV ne fait pas une taille astronomique bien sur.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    En fait, ce que je veux, c'est parcourir le fichier, sauvegarder les en-têtes (dans une table), avec les en-tête, créer des noeuds d'un fichier xml, puis remplir les noeuds avec le reste du fichier.

    J'ai déja réussi à :
    - sauvegarder juste la première ligne
    - créer les noeuds dans le fichier xml

    Le problème c'est que pour le reste, si je ne retire pas la première ligne, dans le fichier xml elle va être prise en compte.
    Autre problème, c'est un très gros fichier CSV

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    regarde du côté de la fonction file qui permet de récupérer les données d'un fichier dans un tableau avec une valeur par ligne du fichier :
    http://php.developpez.com/faq/?page=...#fichiers_file

  6. #6
    Membre expérimenté Avatar de riete
    Homme Profil pro
    DevWeb - Oléiculteur
    Inscrit en
    Avril 2006
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : DevWeb - Oléiculteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 193
    Points : 1 414
    Points
    1 414
    Par défaut
    Je suis désolé, mais je ne comprends pas tous
    Tu dis
    Le problème c'est que pour le reste, si je ne retire pas la première ligne, dans le fichier xml elle va être prise en compte.
    Autre problème, c'est un très gros fichier CSV
    Tu veux donc dire que ton fichier à une entête XML, une description de noeuds, et ensuite les données sont en CSV ???
    As tu regarder les fonction fgetcsv()

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    non, mon fichier de base est en CSV. J'ai utilisé fgetcsv() pour prendre la première ligne d'en tête. Chaque en-tête est un noeud différent. Les données de chaques colonnes se mettront en tant que texte des noeud correspondant.

    Voila mon code :
    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
    43
    44
    45
    46
    47
    48
     
     
    function read_csv($filename, $separateur){
     
    	require_once "mysql.inc.php";
     
    	$row = 0;
    	$j=0;
     
    	$FILE = fopen($filename,'r');
     
    	$document = new DomDocument();
     
    	$hors_delai = $document->createElement('hors_delai');
    	$document->appendChild($hors_delai);
     
    	$contain = $document->createElement('contain');
    	$hors_delai = appendChild($contain);
     
    	while($ligne=fgetcsv($FILE, 2048, $separateur)) !== FALSE && $row != 1){
    		$num = count($ligne);
    		for($c=0;$c<$num;$c++){
    			$i = $c + 1;
    			$req = sprintf("INSERT INTO header(id, value, colonne) VALUE ('', '$nameNode', '$i')");
    			$res = $dbh->query($sql);
     
    			$nameNode = $document->createElement($nameNode);
    			$contain->appendChild($nameNode);
    		}
    		$row++;
    	}
     
    	$request = sprintf("SELECT * FROM header");
    	$result = $dbh->query($req);
     
    	while($row = $result->fetch(PDO::FETCH_NUM)){
    		$tab[$j] = $row[1];
    		$j++;
    	}
     
    	while(($ligne=fgetcsv($FILE, 2048, $separateur)) !== FALSE){
    		$num = count($ligne);
     
    		$txt = utf8_encode($ligne[$c]);
    		$txt = $document->createTextNode($txt);
    		$tab[$c]->appendChild($txt);
    	}
    }
    L'erreur que je vois à l'écran est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Call to a member function appendChild() on a non-object in : ... on line xx
    La ligne xx correspond dans mon code à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab[$c]->appendChild($txt);

  8. #8
    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,

    Fichier exemple 'test.csv' :
    "id";"reference";"libelle"
    "1";"11";"produit 1"
    "2";"12";"produit 2"
    "3";"13";"produit 3"
    "4";"14";"produit 4"
    "5";"15";"produit 5"
    "6";"16";"produit 6"
    "7";"17";"produit 7"
    "8";"18";"produit 8"
    "9";"10";"produit 9"
    "10";"20";"produit 1O"
    Pour fabriquer 'test.xml' :
    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
    <?php
      $src = 'test.csv';
      $dest = 'test.xml';
     
      $canalSrc = fopen($src, 'r');
      $canalDest = fopen($dest, 'w');
     
      $entete = fgetcsv($canalSrc, 1024, ';', '"');
     
      $debut = '<produits>' . "\n";
      fwrite($canalDest, $debut);
      while (($ligne = fgetcsv($canalSrc, 1024, ';', '"')) !== FALSE) 
      {
        fwrite($canalDest, "\t" . '<produit>' . "\n");
        foreach ($ligne as $cle => $valeur)
        {
          fwrite($canalDest, "\t\t" . '<' . $entete[$cle] . '>' . $valeur . '</' . $entete[$cle] . '>' . "\n");
        }
        fwrite($canalDest, "\t" . '</produit>' . "\n");
      }
      $fin = '</produits>' . "\n";
      fwrite($canalDest, $fin);
     
      fclose($canalSrc);
      fclose($canalDest);
    ?>
    Résultat :
    <produits>
    <produit>
    <id>1</id>
    <reference>11</reference>
    <libelle>produit 1</libelle>
    </produit>
    <produit>
    <id>2</id>
    <reference>12</reference>
    <libelle>produit 2</libelle>
    </produit>
    <produit>
    <id>3</id>
    <reference>13</reference>
    <libelle>produit 3</libelle>
    </produit>
    <produit>
    <id>4</id>
    <reference>14</reference>
    <libelle>produit 4</libelle>
    </produit>
    <produit>
    <id>5</id>
    <reference>15</reference>
    <libelle>produit 5</libelle>
    </produit>
    <produit>
    <id>6</id>
    <reference>16</reference>
    <libelle>produit 6</libelle>
    </produit>
    <produit>
    <id>7</id>
    <reference>17</reference>
    <libelle>produit 7</libelle>
    </produit>
    <produit>
    <id>8</id>
    <reference>18</reference>
    <libelle>produit 8</libelle>
    </produit>
    <produit>
    <id>9</id>
    <reference>10</reference>
    <libelle>produit 9</libelle>
    </produit>
    <produit>
    <id>10</id>
    <reference>20</reference>
    <libelle>produit 1O</libelle>
    </produit>
    </produits>
    Si c'est ça que tu cherches à faire.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    Exactement...merci beaucoup franchement, je vais bien étudié le code que tu as fournis, et bien le comprendre, encore merci.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    Juste une question, pour n'afficher que certains noeuds, par exemple, le noeud référence et le noeud libelle, j'écris à la place de $cle, le numéro, 1 ou 2 en gros.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Points : 123
    Points
    123
    Par défaut
    J'ai trouvé une solution (je pense que c'est un peu barbare mais bon, ça marche) :

    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
    <?php
      $src = 'test.csv';
      $dest = 'test.xml';
      
      $canalSrc = fopen($src, 'r');
      $canalDest = fopen($dest, 'w');
      
      $entete = fgetcsv($canalSrc, 1024, ';', '"');
      
      $debut = '<produits>' . "\n";
      fwrite($canalDest, $debut);
      while (($ligne = fgetcsv($canalSrc, 1024, ';', '"')) !== FALSE) 
      {
        fwrite($canalDest, "\t" . '<produit>' . "\n");
    	$col = array(2,3);
    	$i = 1;
    	$j = 0;
        foreach ($ligne as $cle => $valeur)
        {
    		if($i == $col[$j]){
    			fwrite($canalDest, "\t\t" . '<' . $entete[$cle] . '>' . $valeur . '</' . $entete[$cle] . '>' . "\n");
    			$i++;
    			$j++;
    		}else{
    			$i++;
    		}
    	}
        fwrite($canalDest, "\t" . '</produit>' . "\n");
      }
      $fin = '</produits>' . "\n";
      fwrite($canalDest, $fin);
      
      fclose($canalSrc);
      fclose($canalDest);
    ?>
    On rajoute les lignes en GRAS.
    Explication :
    la variable : $col définie les colones à garder dans un tableau (1=1ere colonne, 2=2eme colonne, etc...)
    après avec une condition supplémentaire (if) on regarde si la colonne actuelle est dans le tableau, si oui, on affiche et on incrémente $i et$j (compteur interne au tableau), si non on incrémente $i.

    avec l'exemple ci dessus, cela affichera :

    <produits>
    <produit>
    <reference>11</reference>
    <libelle>produit 1</libelle>
    </produit>
    <produit>
    <reference>12</reference>
    <libelle>produit 2</libelle>
    </produit>
    <produit>
    <reference>13</reference>
    <libelle>produit 3</libelle>
    </produit>
    <produit>
    <reference>14</reference>
    <libelle>produit 4</libelle>
    </produit>
    <produit>
    <reference>15</reference>
    <libelle>produit 5</libelle>
    </produit>
    <produit>
    <reference>16</reference>
    <libelle>produit 6</libelle>
    </produit>
    <produit>
    <reference>17</reference>
    <libelle>produit 7</libelle>
    </produit>
    <produit>
    <reference>18</reference>
    <libelle>produit 8</libelle>
    </produit>
    <produit>
    <reference>10</reference>
    <libelle>produit 9</libelle>
    </produit>
    <produit>
    <reference>20</reference>
    <libelle>produit 1O</libelle>
    </produit>
    </produits>

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

Discussions similaires

  1. Supprimer les premières lignes d'un fichier avec sed
    Par Tchupacabra dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 03/10/2013, 17h38
  2. [Débutant] Supprimer la première ligne d'un fichier .txt
    Par Rymaya dans le forum C#
    Réponses: 9
    Dernier message: 21/12/2012, 01h41
  3. Réponses: 1
    Dernier message: 10/04/2009, 10h13
  4. [CSV] Supprimer la première ligne
    Par ctrl+z dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2007, 11h42
  5. Supprimer la première ligne d'un fichier texte
    Par n@n¤u dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 13/07/2006, 08h38

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