PHP有效读取csv文件


PHP reading a csv file effectively

有几种方法可以用PHP读取CSV文件。我曾经使用 explosion 函数将每行放入数组中,然后使用 explosion 逗号,并使用trim从数据周围删除任何引号。这是混乱的…

在PHP 5中现在有fgetcsv和*str_getcsv*…我猜这是目前最好的方法,所以我拼凑了一些代码…

$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…

你能给的任何输入都会很棒!

有一个逐行读取文件的函数:file(),它也适用于两种换行类型。

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

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

不知道你的$num = count()是关于什么的

这将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;
    }