PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

fputs> <fpassthru
Last updated: Fri, 14 Nov 2008

view this page in

fputcsv

(PHP 5 >= 5.1.0)

fputcsvFormate une ligne en CSV et l'écrit dans un fichier

Description

int fputcsv ( resource $handle , array $fields [, string $delimiter [, string $enclosure ]] )

fputcsv() formate la ligne passée sous forme de tableau fields , puis écrit le résultat dans le fichier handle .

Liste de paramètres

handle

Le pointeur de fichier doit être valide et pointer sur un fichier ouvert avec succès par fopen() ou fsockopen() (et pas encore fermé par fclose()).

fields

Un tableau de valeurs.

delimiter

Le paramètre optionnel delimiter spécifie le délimiteur (un seul caractère). Par défaut, c'est la virgule : ,.

enclosure

Le paramètre enclosure spécifie le caractère d'encadrement (un seul caractère), et par défaut, c'est le guillemet double : ".

Valeurs de retour

Retourne la taille de la chaîne écrite, ou FALSE si une erreur survient.

Exemples

Exemple #1 Exemple avec fputcsv()

<?php

$list 
= array (
    
'aaa,bbb,ccc,dddd',
    
'123,456,789',
    
'"aaa","bbb"'
);

$fp fopen('file.csv''w');

foreach (
$list as $line) {
    
fputcsv($fpsplit(','$line));
}

fclose($fp);
?>

Notes

Note: Si vous avez des problèmes avec PHP qui ne reconnaît pas certaines lignes lors de la lecture de fichiers qui ont été créés ou lus sur un MacIntosh, vous pouvez activer l'option de configuration auto_detect_line_endings.

Voir aussi



fputs> <fpassthru
Last updated: Fri, 14 Nov 2008
 
add a note add a note User Contributed Notes
fputcsv
nate at example dot com
20-Nov-2008 07:17
Alright, after playing a while, I'm confident the following replacement function works in all cases, including the ones for which the native fputcsv function fails. If fputcsv fails to work for you (particularly with mysql csv imports), try this function as a drop-in replacement instead.

Arguments to pass in are exactly the same as for fputcsv, though I have added an additional $mysql_null boolean which allows one to turn php null's into mysql-insertable nulls (by default, this add-on is disabled, thus working identically to fputcsv [except this one works!]).

<?php

function fputcsv2 ($fh, array $fields, $delimiter = ',', $enclosure = '"', $mysql_null = false) {
   
$delimiter_esc = preg_quote($delimiter, '/');
   
$enclosure_esc = preg_quote($enclosure, '/');

   
$output = array();
    foreach (
$fields as $field) {
        if (
$field === null && $mysql_null) {
           
$output[] = 'NULL';
            continue;
        }

       
$output[] = preg_match("/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field) ? (
           
$enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure
       
) : $field;
    }

   
fwrite($fh, join($delimiter, $output) . "\n");
}

// the _EXACT_ LOAD DATA INFILE command to use
// (if you pass in something different for $delimiter
// and/or $enclosure above, change them here too;
// but _LEAVE ESCAPED BY EMPTY!_).
/*
LOAD DATA INFILE
    '/path/to/file.csv'

INTO TABLE
    my_table

FIELDS TERMINATED BY
    ','

OPTIONALLY ENCLOSED BY
    '"'

ESCAPED BY
    ''

LINES TERMINATED BY
    '\n'
*/

?>
jon+dontspamme at phpsitesolutions dot com
30-Jul-2008 07:44
I found that the fputcsv examples for PHP 4 missed one thing, that was proper handling of the $enclosure value when it is a quote (if a quote is passed in a field, and it is delimited by a slash, it will be improperly handled by the functions submitted here).

My modified function was built using the actual PHP5 source for fputcsv, with the addition of properly reacting to the existence of a delimited quote in the field being processed.

<?php
if (!function_exists('fputcsv')) {
    function
fputcsv(&$handle, $fields = array(), $delimiter = ',', $enclosure = '"') {

       
// Sanity Check
       
if (!is_resource($handle)) {
           
trigger_error('fputcsv() expects parameter 1 to be resource, ' .
               
gettype($handle) . ' given', E_USER_WARNING);
            return
false;
        }

        if (
$delimiter!=NULL) {
            if(
strlen($delimiter) < 1 ) {
               
trigger_error('delimiter must be a character', E_USER_WARNING);
                return
false;
            }elseif(
strlen($delimiter) > 1 ) {
               
trigger_error('delimiter must be a single character', E_USER_NOTICE);
            }

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

        if(
$enclosure!=NULL ) {
             if(
strlen($enclosure) < 1 ) {
               
trigger_error('enclosure must be a character', E_USER_WARNING);
                return
false;
            }elseif(
strlen($enclosure) > 1 ) {
               
trigger_error('enclosure must be a single character', E_USER_NOTICE);
            }

           
/* use first character from string */
           
$enclosure = $enclosure[0];
       }

       
$i = 0;
       
$csvline = '';
       
$escape_char = '\\';
       
$field_cnt = count($fields);
       
$enc_is_quote = in_array($enclosure, array('"',"'"));
       
reset($fields);

        foreach(
$fields AS $field ) {

           
/* enclose a field that contains a delimiter, an enclosure character, or a newline */
           
if( is_string($field) && (
               
strpos($field, $delimiter)!==false ||
               
strpos($field, $enclosure)!==false ||
               
strpos($field, $escape_char)!==false ||
               
strpos($field, "\n")!==false ||
               
strpos($field, "\r")!==false ||
               
strpos($field, "\t")!==false ||
               
strpos($field, ' ')!==false ) ) {

               
$field_len = strlen($field);
               
$escaped = 0;

               
$csvline .= $enclosure;
                for(
$ch = 0; $ch < $field_len; $ch++ )    {
                    if(
$field[$ch] == $escape_char && $field[$ch+1] == $enclosure && $enc_is_quote ) {
                        continue;
                    }elseif(
$field[$ch] == $escape_char ) {
                       
$escaped = 1;
                    }elseif( !
$escaped && $field[$ch] == $enclosure ) {
                       
$csvline .= $enclosure;
                    }else{
                       
$escaped = 0;
                    }
                   
$csvline .= $field[$ch];
                }
               
$csvline .= $enclosure;
            } else {
               
$csvline .= $field;
            }

            if(
$i++ != $field_cnt ) {
               
$csvline .= $delimiter;
            }
        }

       
$csvline .= "\n";

        return
fwrite($handle, $csvline);
    }
}
?>
boefje at hotmail dot com
10-Dec-2007 01:28
A complete example to write your records (rows) to a csv file using PHP4.

<?php

if (!function_exists('fputcsv'))
{
 
  function
fputcsv(&$handle, $fields = array(), $delimiter = ';', $enclosure = '"')
  {
   
$str = '';
   
$escape_char = '\\';
    foreach (
$fields as $value)
    {
      if (
strpos($value, $delimiter) !== false ||
         
strpos($value, $enclosure) !== false ||
         
strpos($value, "\n") !== false ||
         
strpos($value, "\r") !== false ||
         
strpos($value, "\t") !== false ||
         
strpos($value, ' ') !== false)
      {
       
$str2 = $enclosure;
       
$escaped = 0;
       
$len = strlen($value);
        for (
$i=0;$i<$len;$i++)
        {
          if (
$value[$i] == $escape_char)
           
$escaped = 1;
          else if (!
$escaped && $value[$i] == $enclosure)
           
$str2 .= $enclosure;
          else
           
$escaped = 0;
         
$str2 .= $value[$i];
        }
       
$str2 .= $enclosure;
       
$str .= $str2.$delimiter;
      }
      else
       
$str .= $value.$delimiter;
    }
   
$str = substr($str,0,-1);
   
$str .= "\n";
    return
fwrite($handle, $str);
  }

}

function
WriteCsv($fileName, $delimiter = ';', $records)
{

 
$result = array();
  foreach(
$records as $key => $value)
   
$results[] = implode($delimiter, $value);
 
$fp = fopen($fileName, 'w');
  foreach (
$results as $result)
   
fputcsv($fp, split($delimiter, $result));
 
fclose($fp);
}

# =================== test ====================

define('CSV_SEPERATOR',';');
define('CSV_PATH','\\');
define('CSV_FILENAME','results.csv');

$records = array (array('aaa','bbb','ccc','dddd'),
                  array(
'123','456','789'),
                  array(
'"test1"', '"test2"', '"test3"')
                 );
                
$fileName = $_SERVER['DOCUMENT_ROOT'] . CSV_PATH . CSV_FILENAME;                
WriteCsv ($fileName,';',$records);                

echo
'<a href="' . CSV_PATH . CSV_FILENAME . '" target="_blanc">CSV File</a>';

?>
ifunk
17-Sep-2007 03:04
I converted this from the PHP source code. This replicates PHP5 functionality exactly, whereas the other examples here do not.

<?php

if (!function_exists('fputcsv')) {
 
  function
fputcsv(&$handle, $fields = array(), $delimiter = ',', $enclosure = '"') {
   
$str = '';
   
$escape_char = '\\';
    foreach (
$fields as $value) {
      if (
strpos($value, $delimiter) !== false ||
         
strpos($value, $enclosure) !== false ||
         
strpos($value, "\n") !== false ||
         
strpos($value, "\r") !== false ||
         
strpos($value, "\t") !== false ||
         
strpos($value, ' ') !== false) {
       
$str2 = $enclosure;
       
$escaped = 0;
       
$len = strlen($value);
        for (
$i=0;$i<$len;$i++) {
          if (
$value[$i] == $escape_char) {
           
$escaped = 1;
          } else if (!
$escaped && $value[$i] == $enclosure) {
           
$str2 .= $enclosure;
          } else {
           
$escaped = 0;
          }
         
$str2 .= $value[$i];
        }
       
$str2 .= $enclosure;
       
$str .= $str2.$delimiter;
      } else {
       
$str .= $value.$delimiter;
      }
    }
   
$str = substr($str,0,-1);
   
$str .= "\n";
    return
fwrite($handle, $str);
  }
 
}

?>
alexxed thething gmail thething com
10-Aug-2007 09:28
A event simpler way:

<?php
   
function fputcsv($hFile, $aRow, $sSeparator=',', $sEnclosure='"')
    {
       foreach (
$aRow as $iIdx=>$sCell)
         
$aRow[$iIdx] = str_replace($sEnclosure, $sEnclosure.$sEnclosure, $sCell);

      
fwrite($hFile, join($aRow, $sSeparator)."\n");
    }
?>
Jonathon Hibbard at phpingenuity.com
04-Aug-2007 05:23
This function is a replacement for PHP 4.  It basically takes an array you pass it, and creates a delimited string.  If you want ot use the key as the field name, you can tell the second paramater to use the key.  The last is the delimiter you want each value to be seperated by.  Should be pretty straight forward.

<?php
function generate_csv_data($data,$use_key=false,$delm=',') {
 
$output = NULL;
  if(
is_array($data)) {
    if(
$use_key == false) {
      if(isset(
$data[0]) && is_array($data[0])) {
        foreach(
$data as $key) {
         
$output .= implode($delm,$key);
         
$output .= "\n";
        }
      } else {
       
$output .= implode("$delm", $data)."\n";
      }
    } else {
      foreach(
$data as $key => $value) {
       
$output .= "$key{$delm}$value\n";
      }
    }
  } else {
   
$output = $data;
  }
  if(empty(
$output)) {
   
trigger_error('OUTPUT WAS EMPTY!', E_USER_ERROR);
    return
false;
  }
  return
$output;
}
?>
enzo dot d dot a at example dot com
26-Jun-2007 12:08
Compact fputcsv function(), for Php version >= 4.0.5 and < 5.1.
Not a "good programming practice", but if you need save bytes ...

<?php
function fputcsv($fp, $arr, $del=",", $enc="\"") {
   
fwrite($fp, (count($arr)) ? $enc . implode("{$enc}{$del}{$enc}", str_replace("\"", "\"\"", $arr)) . $enc . "\n" : "\n");
}
?>
bl at mindbench dot nl
26-Mar-2007 10:55
If you need to save the output to a variable (e.g. for use within a framework) you can write to a temporary memory-wrapper and retrieve it's contents:

<?php
// output up to 5MB is kept in memory, if it becomes bigger it will automatically be written to a temporary file
$csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+');

fputcsv($csv, array('blah','blah'));

rewind($csv);

// put it all in a variable
$output = stream_get_contents($csv);
?>
MagicalTux at ooKoo dot org
18-Jan-2007 03:08
If you need to send a CSV file directly to the browser, without writing in an external file, you can open the output and use fputcsv on it..

<?php
$out
= fopen('php://output', 'w');
fputcsv($out, array('this','is some', 'csv "stuff", you know.'));
fclose($out);
?>
heather at heathercash dot com
26-Sep-2005 01:18
Here is an adaptation to boonerunner's function for fputcsv.
It uses a 2-dimensional array.
Each sub-array is a line in the csv file which then ends up being seperated by commas.

<?php
function fputcsv($filePointer,$dataArray,$delimiter=",",$enclosure="\""){
   
// Write a line to a file
    // $filePointer = the file resource to write to
    // $dataArray = the data to write out
    // $delimeter = the field separator
    
    // Build the string
   
$string = "";
 
   
// for each array element, which represents a line in the csv file...
   
foreach($dataArray as $line){

       
// No leading delimiter
       
$writeDelimiter = FALSE;
       
        foreach(
$line as $dataElement){
           
// Replaces a double quote with two double quotes
           
$dataElement=str_replace("\"", "\"\"", $dataElement);
           
           
// Adds a delimiter before each field (except the first)
           
if($writeDelimiter) $string .= $delimiter;
           
           
// Encloses each field with $enclosure and adds it to the string
           
$string .= $enclosure . $dataElement . $enclosure;
           
           
// Delimiters are used every time except the first.
           
$writeDelimiter = TRUE;
        }
       
// Append new line
       
$string .= "\n";

    }
// end foreach($dataArray as $line)

    // Write the string to the file
   
fwrite($filePointer,$string);
}
?>
boonerunner at hotmail dot com
16-Sep-2005 04:47
Here is an adaption of the above code that adds support for double quotes inside a field. (One double quote is replaced with a pair of double quotes per the CSV format).

<?php
 
function fputcsv($filePointer,$dataArray,$delimiter,$enclosure)
  {
 
// Write a line to a file
  // $filePointer = the file resource to write to
  // $dataArray = the data to write out
  // $delimeter = the field separator
 
  // Build the string
 
$string = "";
 
 
// No leading delimiter
 
$writeDelimiter = FALSE;
  foreach(
$dataArray as $dataElement)
   {
   
// Replaces a double quote with two double quotes
   
$dataElement=str_replace("\"", "\"\"", $dataElement);
   
   
// Adds a delimiter before each field (except the first)
   
if($writeDelimiter) $string .= $delimiter;
   
   
// Encloses each field with $enclosure and adds it to the string
   
$string .= $enclosure . $dataElement . $enclosure;
   
   
// Delimiters are used every time except the first.
   
$writeDelimiter = TRUE;
   }
// end foreach($dataArray as $dataElement)
 
  // Append new line
 
$string .= "\n";
 
 
// Write the string to the file
 
fwrite($filePointer,$string);
  }
?>
twebb at boisecenter dot com
21-Jan-2005 02:54
What about cells that span multiple lines?  This function allows for cells to contain newlines:

<?php
function fputcsv($handle, $row, $fd=',', $quot='"')
{
  
$str='';
   foreach (
$row as $cell)
   {
     
$cell = str_replace($quot, $quot.$quot, $cell);
        
      if (
strchr($cell, $fd) !== FALSE || strchr($cell, $quot) !== FALSE || strchr($cell, "\n") !== FALSE)
      {
        
$str .= $quot.$cell.$quot.$fd;
      }
      else
      {
        
$str .= $cell.$fd;
      }
   }

  
fputs($handle, substr($str, 0, -1)."\n");

   return
strlen($str);
}
?>

I found this reference on the web:
http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm
drew at zitnay dot com
22-Nov-2004 06:42
[EDIT BY danbrown AT php DOT net: This is a revised function with a few bugfixes and improvements done by this author.  The original function example was written by arthur AT mclean DOT ws, and rewritten between by arthur AT korn DOT ch.]

- when calling str_replace(), you must assign $cell the return value or nothing gets saved

- when using strchr(), you should explicitly check !== FALSE, or it'll treat a return value of 0 (found the character at string position 0) as FALSE

- Excel seems to quote not only fields containing commas, but fields containing quotes as well, so I've added another strchr() for quotes; I'm not saying Microsoft knows the correct way for sure, but it seems reasonable to me

- the original function put a space after each comma; that might be legal, I don't know, but I've never seen it (and I don't think it is, because then how would you indicate you wanted a field to start with a space other than by quoting it?)

- the original function didn't correctly return the length of the data outputted

Here's the function, fixed up a bit:

<?php
function fputcsv($handle, $row, $fd=',', $quot='"')
{
  
$str='';
   foreach (
$row as $cell) {
      
$cell=str_replace(Array($quot,        "\n"),
                         Array(
$quot.$quot''),
                        
$cell);
       if (
strchr($cell, $fd)!==FALSE || strchr($cell, $quot)!==FALSE) {
          
$str.=$quot.$cell.$quot.$fd;
       } else {
          
$str.=$cell.$fd;
       }
   }

  
fputs($handle, substr($str, 0, -1)."\n");

   return
strlen($str);
}
?>

Drew

fputs> <fpassthru
Last updated: Fri, 14 Nov 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites