How to Use fgetcsv in PHP (csv file manipulations)

What you will accomplish

PHP fgetcsv()
PHP fgetcsv() | Source

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

Source

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

fgetcsv usage

Do you understand how to use fgetcsv function after reading this article?

See results without voting

More by this Author


Comments 7 comments

JoeW 2 years ago

2 years later and still extremely useful. Thank you for posting this!


kievan profile image

kievan 4 years ago Author

You're welcome :)


thucbk 4 years ago

thanks


Udhaya 4 years ago

Nice to read.

Thanks,

Udhayakumar G K

http://phppapers.blogspot.in/


kievan profile image

kievan 4 years ago Author

Hey Anto, thanks for a great question.

I have made an addition to the article that answers your question. Let me know if you understand.


Anto 4 years ago

Say i have 10 rows for example. I want to display row 1 and 4 only. How would i do it?


preet 4 years ago

can u pls explain it once agan... i m new to php

    Sign in or sign up and post using a HubPages Network account.

    0 of 8192 characters used
    Post Comment

    No HTML is allowed in comments, but URLs will be hyperlinked. Comments are not for promoting your articles or other sites.


    Click to Rate This Article
    working