Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Filesystem Functions : fputcsv

fputcsv

Format line as CSV and write to file pointer (PHP 5 >= 5.1.0)
int fputcsv ( resource handle, array fields [, string delimiter [, string enclosure]] )

fputcsv() formats a line (passed as a fields array) as CSV and write it (terminated by a newline) to the specified file handle.

Parameters

handle

The file pointer must be valid, and must point to a file successfully opened by fopen() or fsockopen() (and not yet closed by fclose()).

fields

An array of values.

delimiter

The optional delimiter parameter sets the field delimiter (one character only). Defaults as a comma: ,.

enclosure

The optional enclosure parameter sets the field enclosure (one character only) and defaults to a double quotation mark: ".

Return Values

Returns the length of the written string, or FALSE on failure.

Examples

Example 642. fputcsv() example

<?php

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

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

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

fclose($fp);
?>


Notes

Note:

If you are having problems with PHP not recognizing the line endings when reading files either on or created by a Macintosh computer, you might want to enable the auto_detect_line_endings run-time configuration option.

See Also
fgetcsv()

Code Examples / Notes » fputcsv

twebb

What about cells that span multiple lines?  This function allows for cells to contain newlines:
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


jonathon hibbard

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;
}
?>


arthur.at.korn.ch

The function in the prior comment doesn't escape quotes in fields, here mine:
function fputcsv($handle, $row, $fd=',', $quot='"')
{
   $str='';
   foreach ($row as $cell) {
       str_replace(Array($quot,        "\n"),
                   Array($quot.$quot,  ''),
                   $cell);
       if (strchr($cell, $fd)) {
           $str.=$quot.$cell.$quot.$fd.' ';
       } else {
           $str.=$cell.$fd.' ';
       }
   }
   fputs($handle, substr($str, 0, -2)."\n");
   return $str-1;
}


magicaltux

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);
?>


bl

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);
?>


drew

I found the following problems with the below function:
- 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:
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


ifunk

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);
 }
 
}
?>


arthur

Here's a simplistic fputcsv function that you can use until the real one gets out of CVS:
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 = "";
     $writeDelimiter = FALSE;
     foreach($dataArray as $dataElement){
       if($writeDelimiter) $string .= $delimiter;
       $string .= $enclosure . $dataElement . $enclosure;
       $writeDelimiter = TRUE;
       } // end foreach($dataArray as $dataElement)
     
     // Append new line
     $string .= "\n";
     
     // Write the string to the file
     fwrite($filePointer, $string);
     
     } // end function fputcsv($filePointer, $dataArray, $delimiter)


boonerunner

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);
 }
?>


heather

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.
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);
}


enzo dot d dot a

Compact fputcsv function(), for Php version >= 4.0.5 and < 5.1.
Not a "good programming practice", but if you need save bytes ...
function fputcsv($fp, $arr, $del=",", $enc="\"") {
fwrite($fp, (count($arr)) ? $enc . implode("{$enc}{$del}{$enc}", str_replace("\"", "\"\"", $arr)) . $enc . "\n" : "\n");
}


alexxed thething gmail thething com

A event simpler way:
   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");
   }


Change Language


Follow Navioo On Twitter
basename
chgrp
chmod
chown
clearstatcache
copy
delete
dirname
disk_free_space
disk_total_space
diskfreespace
fclose
feof
fflush
fgetc
fgetcsv
fgets
fgetss
file_exists
file_get_contents
file_put_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
flock
fnmatch
fopen
fpassthru
fputcsv
fputs
fread
fscanf
fseek
fstat
ftell
ftruncate
fwrite
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
lchgrp
lchown
link
linkinfo
lstat
mkdir
move_uploaded_file
parse_ini_file
pathinfo
pclose
popen
readfile
readlink
realpath
rename
rewind
rmdir
set_file_buffer
stat
symlink
tempnam
tmpfile
touch
umask
unlink
eXTReMe Tracker