PHP有效地读取csv文件

时间:2011-10-06 02:45:30

标签: php

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

在PHP 5中,现在有了 fgetcsv 和* str_getcsv * ......我猜这是最好的方法,所以我把一些代码鞭打在一起...... < / p>

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

,它都能正常工作

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

2 个答案:

答案 0 :(得分:6)

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

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

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

不确定$num = count()的内容。

答案 1 :(得分: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;
    }