Reading csv file in PHP

There are several ways to read CSV files with PHP. I used the break function to put each line in an array, and then explode the commas and use trim to remove any quotes around the data. It was dirty ...

PHP 5 now has fgetcsv and * str_getcsv * ... I assume this is the best way to do this these days, so I damaged the code ...

$fp = fopen($csv_file['file_path'], 'r');       
while (($data = fgetcsv($fp, 0, "\r", '"', "\r")) !== FALSE) {
    $num = count($data);
    for ($c=0; $c < $num; $c++) {
        print_r(str_getcsv($data[$c]));
    }
}

It seems to work, but is there a safer approach? For example, if it works, then line breaks are \ n or \ r ...

Any input you can give will be awesome!

+5
source share
2 answers

This will convert the CSV to a nested array. It may be easier for you to handle:

<?php
    /**
     * 
     */
    function csv_entry_to_array(array $row)
    {
        $column_count = count($row);
        $csv_column_values = array();

        // Loop through the columns of the current CSV entry and store its value
        for ($column_index = 0; $column_index < $column_count; $column_index++)
        {
            // Store the value of the current CSV entry
            $csv_column_values[] = $row[$column_index];
        }

        // Return
        return $csv_column_values;      
    }

    /**
     * @param string    $input_file_name            Filename of input CSV
     * @param boolean   $include_header_in_output   Flag indicating whether the first entry in the CSV is included in the output or not.
     * @param integer   $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.
     * @param string    $delimeter                  Set the field delimiter (one character only).
     * @param string    $enclosure                  Set the field enclosure character (one character only).
     * @param string    $escape                     Set the escape character (one character only). Defaults as a backslash.
     * $return  array                               Nested indexed array representing the CSV. Empty array on error (e.g. input file missing, input file not a CSV).
     */
    function csv_file_to_array($input_file_name, $include_header_in_output = TRUE, $length = 1000, $delimeter = ',', $enclosure = '"', $escape = '\\')
    {
        // NOTE: this attempts to properly recognize line endings when reading files from Mac; has small performance penalty
        ini_set('auto_detect_line_endings', TRUE);

        $csv_array = array();

        // Warnings are supressed, but that OK since the code handles such warnings
        if (($handle = @fopen($input_file_name, "r")) !== FALSE)
        {
            $row_counter      = 0;

            // Iterate over the CSV entries
            while (($row = fgetcsv($handle, $length, $delimeter, $enclosure, $escape)) !== FALSE)
            {           
                if ($row_counter === 0 && $include_header_in_output === TRUE)
                {
                    // This is the first row in the CSV and it should be included in the output
                    $csv_array[] = csv_entry_to_array($row);                
                }
                else if ($row_counter > 0)
                {
                    // This is a row in the CSV that needs to be stored in the return array
                    $csv_array[] = csv_entry_to_array($row);
                }

                $row_counter++;
            }

            // Close file handler
            fclose($handle);
        }
        else
        {
            // Input file: some error occured
            return array();
        }

        return $csv_array;
    }
+2
source

: file(), .

CSV :

$data = array_map("str_getcsv", file($filename));

, $num = count().

+6

All Articles