Bonjour je suis sur ce projet depuis pas mal de temps.
N'y arrivant pas à bout je visn chercher de l'aide.
Je souhaite télécharger un fichier csv, afficher les données dans un tableau html, avec en entete des champs select pour que l'utilisateur puisse choisir ce a quoi les collonnes correspondent. Ensuite enregistrer le tableau dans la Bdd MYSQL.

L'import du fichier csv ce fait très bien, c'est l 'affichage des données qui se complique, voici mon code :
j'aimerai savoir si je m'y prend bien, je penses que non mais je ne c'est pas comment palier a mes restrictions.
Sachant que le nombre de ligne ou de collonne peux etre variable.

<?php
if(fileControl == true){
        //Fichier CSV à parser
        $fichier = $_FILES'file']'tmp_name'];
        //On vérifie que le fichier existe bien
        //On l'ouvre en mode "read only"
        $fp = fopen($fichier, 'r');

/* On ouvre le fichier à importer en lecture seulement */

        while(!feof($fp)){
            //On va générer l'affichage sous forme de tableau
            $ligne = fgets($fp,4096); // On lit les 4096 caractères de la ligne
            $liste = explode(';',$ligne); // On met dans un tableau toutes les données, séparées par des points virgules
            $nbcol = count($liste); // Compter combien de collonne on a
            for($i = 0; $i < $nbcol;$i++){
                foreach($liste as $element){
                //pour chaque valeur les mettre dans le tableau
                    for($numero = 0; $numero < $nbcol; $numero++){
                        $preTab$numero]$numero] = $element;
                    }
                }
            }
        }

        echo '<table style="width:auto;">';
        echo '<thead><tr>';
        for($i = 0 ; $i < $nbcol ; $i++){
            if($i > $nbcol){
                break;
            }
            echo '<th>
            <select name="select">
            <option value="1">Email</option>
            <option value="2">Type</option>
            <option value="3">Entreprise</option>
            <option value="4">Prénom</option>
            <option value="5">Nom</option>
            <option value="6">Code postal</option>
            <option value="7">Ville</option>
            <option value="8">Téléphone</option>
            <option value="9">Téléphone 2</option>
            <option value="10">Fax</option>
            <option value="11">Numéro prospect</option>
            <option value="12">Pays</option>
            <option value="13">Adresse</option>
            <option value="14">Zone</option>
            <option value="15">Site internet</option>
            <option value="16">Commentaire</option>
            </select>
            </th>';
        }
        echo "</tr></thead>";
        echo "<tbody>";
                echo "<tr>";
                    foreach($liste as $element){
                        echo "<td>".$element."</td>";
                    }
                echo "</tr>";
        echo "</tbody>";
        echo '</table>';

        //On ferme le fichier et la balise de tableau
        fclose($fp);

}
?>

Je paie un macdo à celui qui me sauvera la vie =D

4 réponses


salut quel est exactement ton problème d'affichage?
quel est la différence entre ce que tu attends et ce que tu obtiens ?
A+
Oliv

dans ton:

echo '<th>
            <select name="select">
            <option value="1">Email</option>
            <option value="2">Type</option>
            <option value="3">Entreprise</option>
                ...

je ne suis pas très sur des sauts de lignes.

Voilà j'ai fais cette classe pour toi, bonne chance alors :D

<?php
    class csvparser{
        /*
            Array(
                [ligne] => array(
                    [champ] => valeur,
                    ... 
                ),
                ...
            )
        */
        public $data = array();
        public $delimeter = ";"; // Separateur
        function __construct( $filename ){
            $this->initFile( $filename );
        }
        /*
        // Initialiser le fichier CSV
        */
        function initFile( $filename ){

            $filename = $filename.'.csv';
            if( file_exists( $filename ) ){
                $this->handle = fopen( $filename, "r");
                $this->filesize = filesize( $filename );
            }
            return false;
        }
        /*
        // Parser le fichier CSV
        */
        function parse(){
            if( $this->handle !== false ){
                $data = explode( "\n", fread( $this->handle, $this->filesize ) );
                if( $data !== false && count( $data ) > 0 ){
                    $rows = count($data);
                    for ($row = 0; $row < $rows; $row++) { 

                        $d = explode($this->delimeter, $data$row]);
                        if( end($d) == '' ){
                            array_pop( $d );
                        }
                        $this->data$row] = $d;
                    }
                }

            }
        }
        /*
        // Le nombre de lignes
        */
        function getRows(){
            if ( ($rows = count($this->data)) > 0 ){
                return $rows;
            }
            return false;
        }
        /*
        // Importer les champs d'une ligne
        */
        function getDataByRow($row){
            if( $this->getRows() !== false && $this->getRows() >= $row && $row > 0 ){
                return $this->data$row-1];
            }else return false;
        }
        function __destruct(){
            fclose( $this->handle );
        }
    }

    $csv = new csvparser("filename"); // remplace le filename avec ton fichier sans .csv
    $csv->parse();

?>
<table style="width:100%">
    <thead>
        <?php
            for ($i=0; $i < count( $csv->getDataByRow(1) ); $i++) { 
                ?>
                <th style="text-align:left">
                    <select name="select">
                    <option value="1">Exemple</option>
                    <option value="2">Exemple</option>
                    <option value="3">Exemple</option>
                    </select>
                </th>
                <?php
            }
        ?>
    </thead>
    <tbody>
        <?php 
            for ($r=1; $r <= $csv->getRows(); $r++) { 

                ?>
                <tr>
                    <?php
                        $data = $csv->getDataByRow( $r );
                        foreach ($data as $field => $value) {

                            ?>
                                <td><?php echo $value; ?></td>
                            <?php
                        }
                    ?>
                </tr>
                <?php
            }
        ?>
    </tbody>
</table>
vald
Auteur

@mezigh
"salut quel est exactement ton problème d'affichage?"
"Quel est la différence entre ce que tu attends et ce que tu obtiens ?"

je n'arrive pas a afficher toute les données du fichier scv, il ne m'affiche que la derniere ligne. ou bien j'arrive a afficher tout mais ça boucle a l'infini je suis un peu perdu dans le mecanisme.

@RedaElkhayat
Merci, je test ça.
Le temps que je comprenne comment ça marche XD