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

单条记录

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

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

输出:

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);
?> 

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);
?> 
当然您可以把它封装为一个函数,这里不再介绍如何去处理了。