How to upload and parse a CSV file in php

PhpCsv

Php Problem Overview


I want to upload a csv file with php. After the file is uploaded, I want to display the data of the CSV file. I would like an example how to accomplish this task.

Php Solutions


Solution 1 - 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.

Solution 2 - Php

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




}

}

Solution 3 - Php

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.

Solution 4 - Php

You want the handling file uploads section of the PHP manual, and you would also do well to look at fgetcsv() and explode().

Solution 5 - Php

I feel str_getcsv — Parse a CSV string into an array is the best option for you.

  1. You need to upload the file to the server.

  2. Parse the file using str_getcsv.

  3. Run through the array and align as per u need on your website.

Solution 6 - Php

I have created below snippet with the help of @Thomas Clowes answer

$tmpName = $_FILES['csv']['tmp_name'];

$csv_data = array_map('str_getcsv', file($tmpName));

array_walk($csv_data , function(&$x) use ($csv_data) {
  $x = array_combine($csv_data[0], $x);
});

/** 
*
* array_shift = remove first value of array 
* in csv file header was the first value
* 
*/
array_shift($csv_data);

// Print Result Data
echo '<pre/>';
print_r($csv_data);    

It will get result like below

 Array
(
   [0] => Array
    (
        
        [make] => Audi
        [model] => S4
        [grade] => 
        [chassis] => WAUZZZ8K9DA076529
        [year] => 2012
        [kms] => 127000
        [color] => White
        [doors] => 4
        [cc] => 3000
        [engineno] => 
        [trans] => FAT
        [fueltype] => P
        [condition] => 4            
        [price] => 15753
        
    )

)

Solution 7 - Php

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

Solution 8 - Php

public function uploadCsvFile(){
   try{ 
    if($_SERVER['REQUEST_METHOD'] === 'POST'){
        $request = $this->post();
        $fileName = $request->file;
        $file = fopen($fileName, "r"); //open the file
        // $fileName = $_FILES["file"]["tmp_name"];
        while(($column = fgetcsv($file)) !== FALSE){
            $num = count($column);
            $this->dbw->query("insert into csv_upload(first_name,last_name,email,phone,address,pin) values('".$column[0]."','".$column[1]."','".$column[2]."','".$column[3]."','".$column[4]."','".$column[5]."')");
        }

        fclose($file);
    }
    }catch (Exception $e) {
        $this->responseErr($e->getMessage(), 500);
    }
}

Solution 9 - Php

You can try with this:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionn92View Question on Stackoverflow
Solution 1 - PhpThomas ClowesView Answer on Stackoverflow
Solution 2 - PhpxylarView Answer on Stackoverflow
Solution 3 - PhpDavid StutzView Answer on Stackoverflow
Solution 4 - PhpGordonMView Answer on Stackoverflow
Solution 5 - PhpHackerView Answer on Stackoverflow
Solution 6 - Phpvjy tiwariView Answer on Stackoverflow
Solution 7 - PhpSyed IbrahimView Answer on Stackoverflow
Solution 8 - PhpIfa QuadarView Answer on Stackoverflow
Solution 9 - Phpuser5946555View Answer on Stackoverflow