Reading CSV and getting email

Hi

I have written the following code to get the position of the email address from a csv


    function getEmailPosition($delimiter=',', $line, $debug=false)
    {

        if($delimiter){
            // we explode the line based on the delimiter passed.
            $explode = explode($delimiter, $line);
            $emailPosition = null;
            $columnCounter = 1;


            foreach($explode as $column){

                $column = trim($column);
                // replace all single and double quotes from the word so that we can check for email validation
                $column = str_replace( array( '<', '>') , '', $column);

                if($debug) e( "<B>Column *{$columnCounter}*:</B> $column<BR>");

                // check if the string is a valid email, if valid, we will know the position of the email column
                if(filter_var($column, FILTER_VALIDATE_EMAIL)){

                    $emailPosition = $columnCounter;
                    break;
                }

                $columnCounter++;
            }

            return $emailPosition;

        }

        return false;

    } // end getEmailPosition



//usage
$fileContents = file('test.csv');
                foreach($fileContents as $line){
                    $emailPosition = getEmailPosition(',', $line, false);
                    if( $emailPosition) break;
                }


Contents of the test.csv file:


name, address, email, tel
john, "55, abc street" , john@gmail.com, 123456
peter, '118, new street', pet@hotmail.com, 968574

The above function works fine for cases where there are no single / double quotes, but like in the above case, it splits up the comma found inside the quotes which give wrong column position.

Is there a better way to get the email position?

Thanks

Try replacing

$explode = explode($delimiter, $line);

With

$explode = str_getcsv($line, $delimiter);

If my understanding of that function is correct, it will handle the quotes for you automatically.

Seems like your trick solved my problem.

Many thanks :slight_smile: