note 78657 deleted from function.fgetcsv by felipe
| From: | felipe@php.net | Date: | Sun, 09 Dec 2007 15:51:07 +0000 |
| Subject: | note 78657 deleted from function.fgetcsv by felipe | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-133037@lists.php.net to get a copy of this message | ||
Note Submitter: me dot wieringa at home dot nl
----
Yet another tool to parse CSV data into a 2d array. However, when within quotes, newline characters
are treated as data instead of syntax.
<?php
define('LF', "\n");
// Parse a CSV data to a 2D array
function csvToArray($data)
{
// output
$csv = array();
$line = array();
$escaped = false; // Flag: escape char
$quoted = false; // Flag: quoted string
$buffer = ''; // Buffer (quoted values)
$junk = ''; // Junk buffer (unquoted values)
for($i = 0; $i < strlen($data); $i++)
{
$char = $data[$i];
if($quoted)
{
if(($char == '\\') && ($escaped === false))
{
// Set flags
$escaped = true;
}
elseif(($char == '"') && ($escaped === false))
{
// Set flags
$quoted = false;
$escaped = false;
}
else
{
// Add char to buffer
$buffer .= $char;
// Set flags
$escaped = false;
}
}
else
{
if($char == LF) // Start a new line
{
if(strlen($buffer) > 0)
{
// Add buffer to line
$line[] = $buffer;
// Clear buffer
$buffer = '';
}
else
{
$junk = trim($junk);
// Add junk to line (possible unquoted values?)
$line[] = $junk;
}
// Clear junk
$junk = '';
// Add line to CSV
$csv[] = $line;
// Clear line
$line = array();
}
elseif($char == '"') // Start new value
{
// Set flags
$quoted = true;
}
elseif($char == ',')
{
if(strlen($buffer) > 0)
{
// Add buffer to line
$line[] = $buffer;
// Clear buffer
$buffer = '';
}
else
{
$junk = trim($junk);
// Add junk to line (possible unquoted values?)
$line[] = $junk;
}
// Clear junk
$junk = '';
}
else // Add to junk char
{
$junk .= $char;
}
}
}
// Clean up
if(strlen($buffer) > 0)
{
// Add buffer to line
$line[] = $buffer;
// Clear buffer
$buffer = '';
}
else
{
$junk = trim($junk);
// Add junk to line (possible unquoted values?)
$line[] = $junk;
}
$csv[] = $line;
return $csv;
}
?>