PHP | fgetcsv 函数

怎样读取 CSV 文件

最近更新时间 2020-12-31 16:44:34

fgetcsv 函数从文件指针中读入一行并解析 CSV 字段。

如果提供了无效的文件指针,fgetcsv() 会返回 null。其他错误,包括碰到文件结束时返回 false。CSV 文件中的空行将被返回为一个包含有单个 null 字段的数组,不会被当成错误。

函数定义

fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] ) : array
// 源文件位于:ext/standard/file.c
# 函数定义

PHP_FUNCTION(fgetcsv)
{
  char delimiter = ','; /* allow this to be set as parameter */
  char enclosure = '"'; /* allow this to be set as parameter */
  int escape = (unsigned char) '\\';

  zend_long len = 0;
  size_t buf_len;
  char *buf;
  php_stream *stream;
  {
    ...
    if (delimiter_str != NULL) {
      /* Make sure that there is at least one character in string */
      if (delimiter_str_len != 1) {
        zend_argument_value_error(3, "must be a single character");
        RETURN_THROWS();
      }

      /* use first character from string */
      delimiter = delimiter_str[0];
    }

    ...
    PHP_STREAM_TO_ZVAL(stream, fd);
  }

  if (len < 0) {
    if ((buf = php_stream_get_line(stream, NULL, 0, &buf_len)) == NULL) {
      RETURN_FALSE;
    }
  } else {
    buf = emalloc(len + 1);
    if (php_stream_get_line(stream, buf, len + 1, &buf_len) == NULL) {
      efree(buf);
      RETURN_FALSE;
    }
  }

  php_fgetcsv(stream, delimiter, enclosure, escape, buf_len, buf, return_value);
}

参数

  • checkhandle -文件指针。文件指针必须有效,并且是通过 fopen() 或 fsockopen() 函数成功打开的文件(并还未由 fclose() 关闭)。
  • checklength -行长度,可选。
  • checkdelimiter -设置字段分界符(只允许一个字符)。
  • checkenclosure -设置字段环绕符(只允许一个字符)。
  • checkescape -设置转义字符(只允许一个字符),默认是一个反斜杠。

返回值

  • checkbool - 返回包含读取字段的索引数组。

示例1: - 使用 fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段。

<?php
/**
 * PHP 使用 fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 打开文件
$fp = fopen('foo.csv', 'r');

// 判断文件是否读取成功
if(!$fp) exit(0);

// 读取文件
$data = fgetcsv($fp);

// 关闭文件
fclose($fp);
rss_feed