72 votes

Comment charger et analyser un fichier CSV en php ?

Je veux télécharger un fichier csv avec php. Une fois le fichier téléchargé, je veux afficher les données du fichier CSV. J'aimerais avoir un exemple sur la façon d'accomplir cette tâche.

9 votes

6 votes

fgetcsv() dans le manuel PHP

3 votes

Vous n'avez pas trouvé de tutoriel expliquant le téléchargement de fichiers avec PHP ? Je parie qu'il y en a...

75voto

xylar Points 1429

Non testé mais devrait vous donner une idée. la vue :

<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="csv" value="" />
<input type="submit" name="submit" value="Save" /></form>

contrôleur upload.php :

$csv = array();

// check there are no errors
if($_FILES['csv']['error'] == 0){
    $name = $_FILES['csv']['name'];
    $ext = strtolower(end(explode('.', $_FILES['csv']['name'])));
    $type = $_FILES['csv']['type'];
    $tmpName = $_FILES['csv']['tmp_name'];

    // check the file is a csv
    if($ext === 'csv'){
        if(($handle = fopen($tmpName, 'r')) !== FALSE) {
            // necessary if a large csv file
            set_time_limit(0);

            $row = 0;

            while(($data = fgetcsv($handle, 1000, ',')) !== FALSE) {
                // number of fields in the csv
                $col_count = count($data);

                // get the values from the csv
                $csv[$row]['col1'] = $data[0];
                $csv[$row]['col2'] = $data[1];

                // inc the row
                $row++;
            }
            fclose($handle);
        }
    }
}

0 votes

Question rapide : le fichier sera supprimé après l'analyse, n'est-ce pas ? Il est juste stocké dans le dossier temporaire, n'est-ce pas ?

1 votes

C'est une bonne solution, mais je ne sais pas pourquoi vous ne saisissez que les deux premières colonnes de chaque ligne. Aussi, $csv[$row]['row1'] = $data[0]; est trompeur, il devrait être $csv[$row]['column1'] = $data[0]; . Dans tous les cas, une meilleure solution consiste à utiliser simplement $csv[$row]=$data et créer un tableau multidimensionnel avec l'ensemble du fichier.

1 votes

Il est préférable de vérifier le MIME plutôt que l'extension du fichier.

52voto

David Stutz Points 513

Bien que vous puissiez facilement trouver un tutoriel sur la façon de gérer les téléchargements de fichiers avec php, et qu'il existe des fonctions (manuelles) pour gérer les CSV, je vais poster un peu de code parce qu'il y a quelques jours, j'ai travaillé sur un projet, y compris un peu de code que vous pourriez utiliser...

HTML :

<table width="600">
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post" enctype="multipart/form-data">

<tr>
<td width="20%">Select file</td>
<td width="80%"><input type="file" name="file" id="file" /></td>
</tr>

<tr>
<td>Submit</td>
<td><input type="submit" name="submit" /></td>
</tr>

</form>
</table>

PHP :

if ( isset($_POST["submit"]) ) {

   if ( isset($_FILES["file"])) {

            //if there was an error uploading the file
        if ($_FILES["file"]["error"] > 0) {
            echo "Return Code: " . $_FILES["file"]["error"] . "<br />";

        }
        else {
                 //Print file details
             echo "Upload: " . $_FILES["file"]["name"] . "<br />";
             echo "Type: " . $_FILES["file"]["type"] . "<br />";
             echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
             echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

                 //if file already exists
             if (file_exists("upload/" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " already exists. ";
             }
             else {
                    //Store file in directory "upload" with the name of "uploaded_file.txt"
            $storagename = "uploaded_file.txt";
            move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $storagename);
            echo "Stored in: " . "upload/" . $_FILES["file"]["name"] . "<br />";
            }
        }
     } else {
             echo "No file selected <br />";
     }
}

Je sais qu'il doit y avoir un moyen plus simple de le faire, mais je lis le fichier CSV et je stocke les cellules individuelles de chaque enregistrement dans un tableau à deux dimensions.

if ( isset($storagename) && $file = fopen( "upload/" . $storagename , r ) ) {

    echo "File opened.<br />";

    $firstline = fgets ($file, 4096 );
        //Gets the number of fields, in CSV-files the names of the fields are mostly given in the first line
    $num = strlen($firstline) - strlen(str_replace(";", "", $firstline));

        //save the different fields of the firstline in an array called fields
    $fields = array();
    $fields = explode( ";", $firstline, ($num+1) );

    $line = array();
    $i = 0;

        //CSV: one line is one record and the cells/fields are seperated by ";"
        //so $dsatz is an two dimensional array saving the records like this: $dsatz[number of record][number of cell]
    while ( $line[$i] = fgets ($file, 4096) ) {

        $dsatz[$i] = array();
        $dsatz[$i] = explode( ";", $line[$i], ($num+1) );

        $i++;
    }

        echo "<table>";
        echo "<tr>";
    for ( $k = 0; $k != ($num+1); $k++ ) {
        echo "<td>" . $fields[$k] . "</td>";
    }
        echo "</tr>";

    foreach ($dsatz as $key => $number) {
                //new table row for every record
        echo "<tr>";
        foreach ($number as $k => $content) {
                        //new table cell for every field of the record
            echo "<td>" . $content . "</td>";
        }
    }

    echo "</table>";
}

J'espère que cela vous aidera, ce n'est qu'un petit bout de code et je ne l'ai pas testé, car je l'ai utilisé de manière légèrement différente. Les commentaires devraient tout expliquer.

0 votes

Et si quelqu'un voulait sauver le $content obtenue à partir de l'intérieur de la foreach dans les champs de texte ? J'essaie de le faire ici : stackoverflow.com/questions/14536221/

2 votes

La réponse ci-dessous, qui utilise fgetcsv, semble meilleure car elle devrait gérer correctement les caractères échappés.

0 votes

Oui, je vois, fgetcsv est peut-être un meilleur choix.

1voto

GordonM Points 14008

Vous devriez consulter la section "handling file uploads" du manuel PHP, et vous feriez également bien de consulter fgetcsv() et explode().

2 votes

Attention aux virgules, aux guillemets et aux sauts de ligne à l'intérieur des valeurs des chaînes, vous devez utiliser une machine à états pour diviser le CSV, et non pour l'exploser.

1voto

Hacker Points 1760

Je me sens str_getcsv - L'analyse d'une chaîne CSV dans un tableau est la meilleure option pour vous.

  1. Vous devez télécharger le fichier sur le serveur.

  2. Analyse le fichier à l'aide de str_getcsv.

  3. Parcourez le tableau et alignez-le en fonction de vos besoins sur votre site web.

0 votes

Merci pour votre réponse et j'ai une autre question à vous poser : quel est le meilleur plugin pour télécharger un fichier afin d'éviter la taille du code et d'avoir une bonne interface utilisateur, s'il vous plaît, suggérez-moi un plugin.

0 votes

@vinay - je préfère écrire mon propre script de téléchargement. qu'entendez-vous par plugin de téléchargement ? ?? vous pouvez en écrire un vous-même... c'est au maximum 10 lignes de code.

0 votes

@vinay - si vous voulez vraiment avoir un plugin pour faire (php +js) regardez sur tinyurl.com/44nv6yt

0voto

Syed Ibrahim Points 246
function doParseCSVFile($filesArray)
    {
        if ((file_exists($filesArray['frmUpload']['name'])) && (is_readable($filesArray['frmUpload']['name']))) { 

            $strFilePath = $filesArray['frmUpload']['tmp_name']; 

            $strFileHandle = fopen($strFilePath,"r");
            $line_of_text = fgetcsv($strFileHandle,1024,",","'"); 
            $line_of_text = fgetcsv($strFileHandle,1024,",","'"); 

            do { 
                if ($line_of_text[0]) { 
                    $strInsertSql = "INSERT INTO tbl_employee(employee_name, employee_code, employee_email, employee_designation, employee_number)VALUES('".addslashes($line_of_text[0])."', '".$line_of_text[1]."', '".addslashes($line_of_text[2])."', '".$line_of_text[3]."', '".$line_of_text[4]."')";
                    ExecuteQry($strInsertSql);
                }               
            } while (($line_of_text = fgetcsv($strFileHandle,1024,",","'"))!== FALSE);

        } else {
            return FALSE;
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X