How to upload and parse a CSV file in php How to upload and parse a CSV file in php php php

How to upload and parse a CSV file in php


This can be done in a much simpler manner now.

$tmpName = $_FILES['csv']['tmp_name'];$csvAsArray = array_map('str_getcsv', file($tmpName));

This will return you a parsed array of your CSV data. Then you can just loop through it using a foreach statement.


untested but should give you the idea. the view:

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

upload.php controller:

$csv = array();// check there are no errorsif($_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);        }    }}


Although you could easily find a tutorial how to handle file uploads with php, and there are functions (manual) to handle CSVs, I will post some code because just a few days ago I worked on a project, including a bit of code you could use...

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 />";     }}

I know there must be an easier way to do this, but I read the CSV file and store the single cells of every record in an two dimensional array.

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>";}

So I hope this will help, it is just a small snippet of code and I have not tested it, because I used it slightly different. The comments should explain everything.