PHP reading a csv file effectively

后端 未结 2 2123
走了就别回头了
走了就别回头了 2021-02-10 11:18

There are a few ways to read CSV files with PHP. I used to use the explode function to put each line into an array and then explode commas and use trim

相关标签:
2条回答
  • 2021-02-10 11:58

    This converts the CSV into a nested array. Might be easier for you to deal with:

    <?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's 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;
        }
    
    0 讨论(0)
  • 2021-02-10 12:24

    There is a function for reading files in line-wise: file(), which also works on both linebreak types.

    And the shortest method to read in the whole CSV file is:

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

    Not sure what your $num = count() was about.

    0 讨论(0)
提交回复
热议问题