<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.filesystem.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'en',
  ),
  'this' => 
  array (
    0 => 'function.fgetcsv.php',
    1 => 'fgetcsv',
    2 => 'Gets line from file pointer and parse for CSV fields',
  ),
  'up' => 
  array (
    0 => 'ref.filesystem.php',
    1 => 'Filesystem Functions',
  ),
  'prev' => 
  array (
    0 => 'function.fgetc.php',
    1 => 'fgetc',
  ),
  'next' => 
  array (
    0 => 'function.fgets.php',
    1 => 'fgets',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    'path' => 'reference/filesystem/functions/fgetcsv.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.fgetcsv" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">fgetcsv</h1>
  <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">fgetcsv</span> &mdash; <span class="dc-title">Gets line from file pointer and parse for CSV fields</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.fgetcsv-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="modifier">function</span> <span class="methodname"><strong>fgetcsv</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="parameter">$stream</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><span class="type"><a href="language.types.null.php" class="type null">?</a></span><span class="type"><a href="language.types.integer.php" class="type int">int</a></span></span> <code class="parameter">$length</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$separator</code><span class="initializer"> = &quot;,&quot;</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$enclosure</code><span class="initializer"> = &quot;\&quot;&quot;</span></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$escape</code><span class="initializer"> = &quot;\\&quot;</span></span><br>): <span class="type"><span class="type"><a href="language.types.array.php" class="type array">array</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   Similar to <span class="function"><a href="function.fgets.php" class="function">fgets()</a></span> except that
   <span class="function"><strong>fgetcsv()</strong></span> parses the line it reads for fields in
   <abbr title="Comma-Separated Values">CSV</abbr> format and returns an array containing the fields
   read.
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="simpara">
    The locale settings are taken into account by this function.
    For example, data encoded in certain one-byte encodings may be parsed
    incorrectly if <strong><code><a href="string.constants.php#constant.lc-ctype">LC_CTYPE</a></code></strong> is
    <code class="literal">en_US.UTF-8</code>.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.fgetcsv-parameters">
  <h3 class="title">Parameters</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">stream</code></dt>
     <dd>
      <p class="para">
       A valid file pointer to a file successfully opened by
       <span class="function"><a href="function.fopen.php" class="function">fopen()</a></span>, <span class="function"><a href="function.popen.php" class="function">popen()</a></span>, or
       <span class="function"><a href="function.fsockopen.php" class="function">fsockopen()</a></span>.
      </p>
     </dd>
    
    
     <dt><code class="parameter">length</code></dt>
     <dd>
      <p class="para">
       Must be greater than the longest line (in characters) to be found in
       the CSV file (allowing for trailing line-end characters). Otherwise the
       line is split in chunks of <code class="parameter">length</code> characters,
       unless the split would occur inside an enclosure.
      </p>
      <p class="para">
       Omitting this parameter (or setting it to 0,
       or <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> in PHP 8.0.0 or later) the maximum line length is not limited,
       which is slightly slower.
      </p>
     </dd>
    
    
     <dt><code class="parameter">separator</code></dt>
     <dd>
      <p class="para">
       The <code class="parameter">separator</code> parameter sets the field separator.
       It must be a single byte character.
      </p>
     </dd>
    
    
     <dt><code class="parameter">enclosure</code></dt>
     <dd>
      <p class="para">
       The <code class="parameter">enclosure</code> parameter sets the field enclosure character.
       It must be a single byte character.
      </p>
     </dd>
    
    
     <dt><code class="parameter">escape</code></dt>
     <dd>
      <p class="para">
       The <code class="parameter">escape</code> parameter sets the escape character.
       It must be a single byte character or the empty string.
       The empty string (<code class="literal">&quot;&quot;</code>) disables the proprietary escape mechanism.
      </p>
      <div class="warning"><strong class="warning">Warning</strong>
       <p class="simpara">
        In the input stream, the <code class="parameter">enclosure</code> character
        can always be escaped by doubling it inside a quoted string,
        resulting in a single <code class="parameter">enclosure</code> character
        in the parsed result.
        The <code class="parameter">escape</code> character works differently:
        If a sequence of <code class="parameter">escape</code> and
        <code class="parameter">enclosure</code> characters appear in the input,
        both characters will be present in the parsed result.
        So for the default parameters, a CSV line like
        <code class="literal">&quot;a&quot;&quot;b&quot;,&quot;c\&quot;d&quot;</code> will have the fields parsed as
        <code class="literal">a&quot;b</code> and <code class="literal">c\&quot;d</code>, respectively.
       </p>
      </div>
      <div class="warning"><strong class="warning">Warning</strong>
       <p class="simpara">
        As of PHP 8.4.0, depending on the default value of
        <code class="parameter">escape</code> is deprecated.
        It needs to be provided explicitly either positionally or by the use
        of <a href="functions.arguments.php#functions.named-arguments" class="link">named arguments</a>.
       </p>
      </div>
     </dd>
    
   </dl>
  </p>
  <div class="warning"><strong class="warning">Warning</strong><p class="simpara">
 When <code class="parameter">escape</code> is set to anything other than an empty string
 (<code class="literal">&quot;&quot;</code>) it can result in CSV that is not compliant with
 <a href="https://datatracker.ietf.org/doc/html/rfc4180" class="link external">&raquo;&nbsp;RFC 4180</a> or unable to survive a roundtrip
 through the PHP CSV functions. The default for <code class="parameter">escape</code> is
 <code class="literal">&quot;\\&quot;</code> so it is recommended to set it to the empty string explicitly.
 The default value will change in a future version of PHP, no earlier than PHP 9.0.
</p></div>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.fgetcsv-returnvalues">
  <h3 class="title">Return Values</h3>
  <p class="para">
   Returns an indexed array containing the fields read on success,  or <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> on failure.
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    A blank line in a CSV file will be returned as an array
    comprising a single <span class="type"><a href="language.types.null.php" class="type null">null</a></span> field, and will not be treated
    as an error.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: <p class="simpara">Prior to PHP 8.1.0, the
<a href="filesystem.configuration.php#ini.auto-detect-line-endings" class="link">auto_detect_line_endings</a>
run-time configuration option could be enabled to help PHP properly recognize
line endings when reading files created on Macintosh systems. This option has
been deprecated as of PHP 8.1.0. If necessary, handle <code class="literal">&quot;\r&quot;</code>
line breaks manually instead.</p></p></blockquote>
 </div>


 <div class="refsect1 errors" id="refsect1-function.fgetcsv-errors">
  <h3 class="title">Errors/Exceptions</h3>
  <p class="simpara">
   Throws a <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> if
   <code class="parameter">separator</code> or <code class="parameter">enclosure</code>
   is not one byte long.
  </p>
  <p class="simpara">
   Throws a <span class="exceptionname"><a href="class.valueerror.php" class="exceptionname">ValueError</a></span> if
   <code class="parameter">escape</code> is not one byte long or the empty string.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.fgetcsv-changelog">
  <h3 class="title">Changelog</h3>
  <p class="para">
   <table class="doctable informaltable">
    
     <thead>
      <tr>
       <th>Version</th>
       <th>Description</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>8.4.0</td>
       <td>
        Relying on the default value of <code class="parameter">escape</code> is now
        deprecated.
       </td>
      </tr>

      <tr>
       <td>8.3.0</td>
       <td>
        An empty string is returned instead of a string with a single
        null byte for the last field if it contains only an unterminated
        enclosure.
       </td>
      </tr>

      <tr>
       <td>8.0.0</td>
       <td>
        <code class="parameter">length</code> is now nullable.
       </td>
      </tr>

      <tr>
       <td>7.4.0</td>
       <td>
        The <code class="parameter">escape</code> parameter now also accepts an empty
        string to disable the proprietary escape mechanism.
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.fgetcsv-examples">
  <h3 class="title">Examples</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Example #1 Read and print the entire contents of a CSV file</strong></p>
    <div class="example-contents">
<div class="phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">if ((</span><span style="color: #0000BB">$handle </span><span style="color: #007700">= </span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">"test.csv"</span><span style="color: #007700">, </span><span style="color: #DD0000">"r"</span><span style="color: #007700">)) !== </span><span style="color: #0000BB">false</span><span style="color: #007700">) {
    </span><span style="color: #0000BB">$row </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;

    while ((</span><span style="color: #0000BB">$fields </span><span style="color: #007700">= </span><span style="color: #0000BB">fgetcsv</span><span style="color: #007700">(</span><span style="color: #0000BB">$handle</span><span style="color: #007700">, </span><span style="color: #0000BB">1000</span><span style="color: #007700">, </span><span style="color: #DD0000">","</span><span style="color: #007700">, </span><span style="color: #DD0000">"\""</span><span style="color: #007700">, </span><span style="color: #DD0000">"\\"</span><span style="color: #007700">)) !== </span><span style="color: #0000BB">false</span><span style="color: #007700">) {
        </span><span style="color: #0000BB">$num </span><span style="color: #007700">= </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$fields</span><span style="color: #007700">);

        echo </span><span style="color: #DD0000">"\n&lt;p&gt;</span><span style="color: #0000BB">$num</span><span style="color: #DD0000"> fields in line </span><span style="color: #0000BB">$row</span><span style="color: #DD0000">:&lt;/p&gt;\n&lt;ol&gt;"</span><span style="color: #007700">;

        for (</span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$c </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">$num</span><span style="color: #007700">; </span><span style="color: #0000BB">$c</span><span style="color: #007700">++) {
            echo </span><span style="color: #DD0000">"\n\t&lt;li&gt;"</span><span style="color: #007700">, </span><span style="color: #0000BB">$fields</span><span style="color: #007700">[</span><span style="color: #0000BB">$c</span><span style="color: #007700">], </span><span style="color: #DD0000">"&lt;/li&gt;"</span><span style="color: #007700">;
        }

        echo </span><span style="color: #DD0000">"\n&lt;/ol&gt;"</span><span style="color: #007700">;

        </span><span style="color: #0000BB">$row</span><span style="color: #007700">++;
    }

    </span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$handle</span><span style="color: #007700">);
}</span></code></pre></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.fgetcsv-seealso">
  <h3 class="title">See Also</h3>
  <ul class="simplelist">
   <li><span class="function"><a href="function.fputcsv.php" class="function" rel="rdfs-seeAlso">fputcsv()</a> - Format line as CSV and write to file pointer</span></li>
   <li><span class="function"><a href="function.str-getcsv.php" class="function" rel="rdfs-seeAlso">str_getcsv()</a> - Parse a CSV string into an array</span></li>
   <li><span class="methodname"><a href="splfileobject.fgetcsv.php" class="methodname" rel="rdfs-seeAlso">SplFileObject::fgetcsv()</a> - Gets line from file and parse as CSV fields</span></li>
   <li><span class="methodname"><a href="splfileobject.fputcsv.php" class="methodname" rel="rdfs-seeAlso">SplFileObject::fputcsv()</a> - Write a field array as a CSV line</span></li>
   <li><span class="methodname"><a href="splfileobject.setcsvcontrol.php" class="methodname" rel="rdfs-seeAlso">SplFileObject::setCsvControl()</a> - Set the delimiter, enclosure and escape character for CSV</span></li>
   <li><span class="methodname"><a href="splfileobject.getcsvcontrol.php" class="methodname" rel="rdfs-seeAlso">SplFileObject::getCsvControl()</a> - Get the delimiter, enclosure and escape character for CSV</span></li>
   <li><span class="function"><a href="function.explode.php" class="function" rel="rdfs-seeAlso">explode()</a> - Split a string by a string</span></li>
   <li><span class="function"><a href="function.file.php" class="function" rel="rdfs-seeAlso">file()</a> - Reads entire file into an array</span></li>
   <li><span class="function"><a href="function.pack.php" class="function" rel="rdfs-seeAlso">pack()</a> - Pack data into binary string</span></li>
  </ul>
 </div>


</div><?php manual_footer($setup); ?>