- HubPages»
- Technology»
- Computers & Software»
- Computer Science & Programming»
- Programming Languages
How to Use fgetcsv in PHP (csv file manipulations)
What you will accomplish
Summary
A function that will make your life easier for quick and painless import of a CSV (comma separated values) file into your PHP script.
My Setup - WAMP Server
In order to program in PHP on Windows I will be using WAMP server. For an easy setup refer to my WAMP Server Tutorial.
fgetcsv_PHP.php
<?php fgetcsv_PHP(); function fgetcsv_PHP() { /* * See if we can open a file named fgetcsv.csv in * read mode, if we can then assign pointer to this * file to a variable named $handle * 'r' - Open for reading only; place the file * pointer at the beginning of the file. */ if (($handle = fopen("./delimitedValues.csv", "r")) !== FALSE) { /* * fgetcsv( resource $handle int $length string $delimiter ) * * resource $handle * A valid file pointer to a file successfully opened by fopen(), * popen(), or fsockopen(). * * int $length * Must be greater than the longest line (in characters) to be * found in the CSV file (allowing for trailing line-end characters). * It became optional in PHP 5. Omitting this parameter (or setting * it to 0 in PHP 5.0.4 and later) the maximum line length is not * limited, which is slightly slower. * * string $delimiter * Set the field delimiter (one character only). * * RETURN VALUES * * Returns an indexed array containing the fields read. * * Note: A blank line in a CSV file will be returned as an array * comprising a single null field, and will not be treated * as an error. * * Note: If PHP is not properly recognizing the line endings when * reading files either on or created by a Macintosh computer, * enabling the auto_detect_line_endings run-time configuration * option may help resolve the problem. * * fgetcsv() returns NULL if an invalid handle is supplied or FALSE * on other errors, and when the end of file has been reached. */ $length = 1000; $delimiter = "|"; /* * Print the opening table tag to begin buiding HTML table * and the first row of the table; with column names */ echo "<table>\n"; echo "<td><b>Name</b></td><td><b>Surname</b></td><td><b>Email</b></td>"; /* * Loop through the array of values returned by fgetcsv until there are * no more lines (indicated by FALSE) */ while ( ( $data = fgetcsv( $handle, $length, $delimiter ) ) !== FALSE ) { // Count number of array elements in $data $num = count($data); // Print opening table row HTML tag echo "<tr>\n"; /* * Loop through the $data array and output each element * wrapped by opening and closing table data HTML tags */ for ($c=0; $c < $num; $c++) { echo "<td>".$data[$c]."</td>\n"; } // Print closing table row HTML tag echo "</tr>\n"; } // Print close table HTML tag echo "</table>"; // Close the file pointed to by $handle fclose($handle); } } ?>
CSV file
Here are the contents of the CSV file. Note: I deliberately chose a pipe character("|") as my delimiter to show that any character or character set can be used for delimiting your values.
delimitedValues.csv
John|Smith|jsmith@somemail.com
John|Doe|jdoe@somemail.com
Jane|Doe|jdoe1@somemail.com
The result of using fgetcsv_PHP.php
Explanation
Now that you have seen the PHP script you might want a more high level explanation of what is going on. Simply put, fgetcsv is specialized file parser that helps developers reading the data and importing that data into their PHP scripts, and then doing whatever it is they need to do with the data.
In my PHP program I decided to import some fictitious data to show what the function can do. I am taking the data from the file "delimitedValues.csv" and constructing an HTML table out of that data, which is then displayed in a browser.
This function can be very useful if used for importing a lot of data into your scripts. For example you could be scanning your grocery receipts, then you could convert your scanned receipts into csv files, perform some formatting, and then you could add everything to your database using fgetcsv.
Hope you enjoyed this tutorial and if something is not clear please leave a comment and I'll get back to you asap!
Custom CSV Data Processing
Recently I got a comment asking about how to display a particular row or rows of data. More specifically how to display row number 1 and 4 out of 10 rows of CSV data. I thought this was a good question and decided to incorporate the answer as an addition to the article.
So the code snippet that follows is a modification to the code I showed above without any comments (green text). Essentially I added a condition that checks the number of the row and if the condition is met then the code block is executed (parsing the row of data to create html code).
To be able to count the rows that I have already processed with the fgetcsv() function I added a variable called $i that acts as a row counter. Every time I process a row of CSV data I add 1 to the $i variable and thus keep track of my rows.
The condition checks to see if the variable $i is equal to 0 or 3 ($i is initially equal to 0 not 1), and if this is true, the code in curly brackets is executed.
Custom CSV Data Processing Code Snippet
<?php fgetcsv_PHP(); function fgetcsv_PHP() { if (($handle = fopen("./delimitedValues_10rows.csv", "r")) !== FALSE) { $length = 1000; $delimiter = "|"; echo "<table>\n"; echo "<td><b>Name</b></td><td><b>Surname</b></td><td><b>Email</b></td>"; $i = 0; // ADDED while ( ( $data = fgetcsv( $handle, $length, $delimiter ) ) !== FALSE ) { if( $i == 0 || $i == 3 ) // ADDED { $num = count($data); echo "<tr>\n"; for ($c=0; $c < $num; $c++) { echo "<td>".$data[$c]."</td>\n"; } echo "</tr>\n"; } $i++; // ADDED } echo "</table>"; fclose($handle); } } ?>