|
|
 |
fputcsv (PHP 5) fputcsv --
Format line as CSV and write to file pointer
Descriptionint fputcsv ( resource handle [, array fields [, string delimiter [, string enclosure]]] )
fputcsv() formats a line (passed as a
fields array) as CSV and write it to the
specified file handle. Returns the length of the
written string, or FALSE on failure.
The optional delimiter parameter sets the field
delimiter (one character only). Defaults as a comma: ,.
The optional enclosure parameter sets the field
enclosure (one character only) and defaults to a double quotation mark:
".
Example 1. 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);
?>
|
|
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().
User Contributed Notes
fputcsv
twebb at boisecenter dot com
21-Jan-2005 07:54
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
drew at zitnay dot com
22-Nov-2004 11:42
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
arthur.at.korn.ch
19-Nov-2004 11:56
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;
}
arthur at mclean dot ws
11-Nov-2004 04:10
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)
| |