首页 文章

PHP有效地读取csv文件

提问于
浏览
5

有几种方法可以使用PHP读取CSV文件 . 我曾经使用explode函数将每一行放入一个数组中然后爆炸逗号并使用trim来删除数据周围的任何引号 . 这很乱......

在PHP 5中,现在有fgetcsv和* str_getcsv * ...我'm guessing this is the best way to go about it these days so I' ve将一些代码鞭打在一起......

$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]));
    }
}

它似乎工作,但有更多的失败安全方法?例如,无论换行是\ n还是\ r \ n都能正常工作......

您可以提供任何输入都很棒!

2 回答

  • 2

    这会将CSV转换为嵌套数组 . 您可能更容易处理:

    <?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;
        }
    
  • 6

    有一个按行读取文件的功能:file(),它也适用于两种换行类型 .

    读取整个CSV文件的最短方法是:

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

    不确定你的 $num = count() 是什么 .

相关问题