PHP fgetcsv()
函数 用来从打开的文件中获取一行并解析csv字段。内容写入csv文件参考 fputcsv() 函数。
该函数可以说是 fgets() 函数的衍生方法,只不过它多做了一步将读取的内容解析为csv数组。通过该方法我们可以读取csv文件。
该函数不能单独使用,因为要读取文件的内容首先得先打开文件 fopen(),读取完成最后得关闭文件 fclose()。
语法
fgetcsv(file, length, delimiter, enclosure, escape)
参数
参数 说明 必须/可选 file 指定要读取的文件,它是一个文件指针变量 必须 length 指定要读取的最大长度,必须大于 CVS 文件内最长的一行。 可选 separator 设置csv的分节符,只允许一个字符,默认为逗号, 可选 enclosure 设置字段环绕,只允许一个字符,默认为双引号 可选
返回值
成功返回文件中一行的内容并解析为csv数组,失败返回false。
注意点
- CSV 文件中的空行将被返回为一个包含有单个 null 字段的数组,不会被当成错误。
- 该函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误。
- 如果碰到 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"
}
[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);
?>
当然您可以把它封装为一个函数,这里不再介绍如何去处理了。