• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • SplFileObject::fgetcsv()

    (PHP 5 >= 5.1.0, PHP 7)

    Gets line from file and parse as CSV fields

    说明

    publicSplFileObject::fgetcsv([string $delimiter= ","[,string $enclosure= """[,string $escape= ""]]]): array

    Gets a line from the file which is in CSV format and returns an array containing the fields read.

    Note:

    The locale settings are taken into account by this function. IfLC_CTYPEis e.g.en_US.UTF-8, files in one-byte encodings may be read wrongly by this function.

    参数

    $delimiter

    The field delimiter(one character only). Defaults as a comma or the value set using SplFileObject::setCsvControl().

    $enclosure

    The field enclosure character(one character only). Defaults as a double quotation mark or the value set using SplFileObject::setCsvControl().

    $escape

    The escape character(at most one character). Defaults as a backslash()or the value set using SplFileObject::setCsvControl(). An empty string("")disables the proprietary escape mechanism.

    Note: Usually an$enclosurecharacter is escpaped inside a field by doubling it; however, the$escapecharacter can be used as an alternative. So for the default parameter values""and"have the same meaning. Other than allowing to escape the$enclosurecharacter the$escapecharacter has no special meaning; it isn't even meant to escape itself.

    返回值

    Returns an indexed array containing the fields read, or FALSE on error.

    Note:

    A blank line in a CSV file will be returned as an array comprising a single NULL field unless using SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, in which case empty lines are skipped.

    更新日志

    版本说明
    7.4.0 The$escapeparameter now also accepts an empty string to disable the proprietary escape mechanism.

    范例

    SplFileObject::fgetcsv() example

    <?php
    $file = new SplFileObject("data.csv");
    while (!$file->eof()) {
        var_dump($file->fgetcsv());
    }
    ?>
    

    SplFileObject::READ_CSV example

    <?php
    $file = new SplFileObject("animals.csv");
    $file->setFlags(SplFileObject::READ_CSV);
    foreach ($file as $row) {
        list($animal, $class, $legs) = $row;
        printf("A %s is a %s with %d legs\n", $animal, $class, $legs);
    }
    ?>
    

    Contents of animals.csv

    crocodile,reptile,4
    dolphin,mammal,0
    duck,bird,2
    koala,mammal,4
    salmon,fish,0

    以上例程的输出类似于:

    A crocodile is a reptile with 4 legs
    A dolphin is a mammal with 0 legs
    A duck is a bird with 2 legs
    A koala is a mammal with 4 legs
    A salmon is a fish with 0 legs
    

    参见

    • SplFileObject::setCsvControl() Set the delimiter, enclosure and escape character for CSV
    • SplFileObject::setFlags() Sets flags for the SplFileObject
    • SplFileObject::READ_CSV
    • SplFileObject::current() Retrieve current line of file
    Note that due to bugs 55807 and 61032, introduced in 5.3.8, if the csv in example #2 has a newline character at the end of each line, the foreach will execute 6 times.
    The last time through the loop $row will be bool(false). This is true even if using SplFileObject::SKIP_EMPTY and SplFileObject::DROP_NEW_LINE.
    Until the bug is fixed, the workaround is to also add SplFileObject::READ_AHEAD to your setFlags() call.
    Be aware.
    There is bug 46569 persists that breaks usage of SplFileObject::fgetcsv() after SplFileObject::seek() ing to a non-zero position and then returns the contents of wrong line - off by one
    <?php
    $file = new SplFileObject('foo/bar.csv');
    $file->seek(1);
    print_r($file->fgetcsv()); // reads 3rd line against 2nd
    after setting the delimiter '\t' fgetcsv() truncates the value when it is empty string 
    workaround:
    <?php
    $file = new SplFileObject($path);
    $file->setFlags(SplFileObject::DROP_NEW_LINE);
    while ($file->valid()) {
      $line = $file->fgets();
      $line = explode("\t", $line);
      print_r($line);
    }
    ?>
    
    If your CSV doesn't have enclosures, you can face an issue with default " identified as enclosure in data. Empty $enclosure is not allowed, but you can use same $enclosure as $delimiter (\n by default) to emulate empty enclosure.