PHP 文件函数

PHP fgetcsv() 函数 用来从打开的文件中获取一行并解析csv字段。内容写入csv文件参考 fputcsv() 函数

该函数可以说是 fgets() 函数的衍生方法,只不过它多做了一步将读取的内容解析为csv数组。通过该方法我们可以读取csv文件。 

该函数不能单独使用,因为要读取文件的内容首先得先打开文件 fopen(),读取完成最后得关闭文件 fclose()

语法

fgetcsv(file, length, delimiter, enclosure, escape)

    参数

    参数
    说明必须/可选
    file指定要读取的文件,它是一个文件指针变量必须
    length指定要读取的最大长度,必须大于 CVS 文件内最长的一行。可选
    separator设置csv的分节符,只允许一个字符,默认为逗号,可选
    enclosure
    设置字段环绕,只允许一个字符,默认为双引号可选

    返回值

    成功返回文件中一行的内容并解析为csv数组,失败返回false。

    注意点

    1. CSV 文件中的空行将被返回为一个包含有单个 null 字段的数组,不会被当成错误。
    2. 该函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误。
    3. 如果碰到 PHP 在读取文件时不能识别 Macintosh 文件的行结束符,可以激活 auto_detect_line_endings 运行时配置选项。

    例子

    现介绍一些简单的例子了解该函数的使用方法。

    首先创建一个test.csv文件如下:

    id,name,age
    1,张三,18
    2,李四,22
    • 1
    • 2

    例1

    单条记录

    这里结合 fopen(),fclose() 函数介绍该函数的使用:

    <?php
    //建议使用try catch 的方式读取文件
    $test = fopen("test.csv", 'r') or die("文件不存在!");
    $content = fgetcsv($test);//获取一行
    var_dump($content);
    fgetcsv($test);
    ?> 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出:

    array(3) {
      [0]=>
      string(2) "id"
      [1]=>
      string(4) "name"
      [2]=>
      string(3) "age"
    }

    显然,这不是我们想要的结果,我们需要遍历处csv所有元素的值。

    例2 

    这里使用了feof()函数遍历单个文件,输出所有的行,使用了array_walk() 函数处理数组元素的中文乱码问题。

    <?php
    function transfer(&$val, $k){
        $val = iconv('gb2312','utf-8', $val);
    }
    //建议使用try catch 的方式读取文件
    $test = fopen("test.csv", 'r') or die("文件不存在!");
    //乱码
    while (!feof($test)) {  
    	//如果没有达到文件末尾就一直读取  
    	$content = fgetcsv($test);//获取一行  
            array_walk($content, 'transfer');//解决csv乱码的问题
    	var_dump($content);
    }
    fgetcsv($test);
    ?> 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    array(3) {
      [0]=>
      string(2) "id"
      [1]=>
      string(4) "name"
      [2]=>
      string(3) "age"
    }
    array(3) {
      [0]=>
      string(1) "1"
      [1]=>
      string(6) "张三"
      [2]=>
      string(2) "18"
    }
    array(3) {
      [0]=>
      string(1) "2"
      [1]=>
      string(6) "李四"
      [2]=>
      string(2) "22"
    }
    bool(false)
     

     把代码再优化一下:

    <?php
    function transfer(&$val, $k){
        $val = iconv('gb2312','utf-8', $val);
    }
    //建议使用try catch 的方式读取文件
    $test = fopen("test.csv", 'r') or die("文件不存在!");
    $arr = array();
    $keys = array('id','name','age');
    $i = 0;
    //乱码
    while (!feof($test)) {  
        //如果没有达到文件末尾就一直读取  
        $content = fgetcsv($test);//获取一行  
        array_walk($content, 'transfer');//解决乱码的问题
        $arr[] = array_combine($keys, $content);
    	
    }
    fgetcsv($test);
    array_shift($arr);//去掉第一个,当然您也可以使用一个变量来判断
    var_dump($arr);
    ?> 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    当然您可以把它封装为一个函数,这里不再介绍如何去处理了。