Scripts
CSV bestanden parsen
Een script om CSV bestanden uit te lezen, en te parsen naar een 2D array. - escape quotes: "" en/of \" Momenteel is alleen de Micro$oft methode is opgenomen; "" = " - seperator: ';' en/of ',' Zowel ; als , zijn geldige scheidingstekens - spaties in document wel/niet overnemen? Als waarden ge-quote zijn, worden deze niet getrimmed, anders worden de waarden wel getrimmed. - lege regels wel/niet opnemen in array? Configureerbaar d.b.v. de boolean $bSkipEmptyLines. - velden met enters? Als waarden ge-quote zijn, mogen deze enters bevatten.
csv-bestanden-parsen
<?php
// Parse a CSV file to a 2D array.
function csvToArray($sFilePath = "", $bSkipEmptyLines = true, $bReportErrors = true)
{
/*
- escape quote: "" en/of \" Alleen de Micro$oft methode is opgenomen => ""
- seperator: ';' en/of ',' Zowel ; als , zijn geldige scheidingstekens
- spaties in document wel/niet overnemen? Als waarden ge-quote zijn, worden deze niet getrimmed, anders worden de waarden wel getrimmed.
- lege regels wel/niet opnemen in array? Configureerbaar d.b.v. de boolean $bSkipEmptyLines.
- velden met enters? Als waarden ge-quote zijn, mogen deze enters bevatten.
*/
$aSeperators = array(",", ";");
$iLineCount = 0;
$aRows = array();
$aColumns = array();
if(strcasecmp($sFilePath, "") !== 0)
{
if(is_file($sFilePath))
{
if(filesize($sFilePath) > 0)
{
if(is_readable($sFilePath))
{
$sContent = file_get_contents($sFilePath);
$sValue = '';
for($i = 0; $i < strlen($sContent); $i++)
{
$sCharacter = substr($sContent, $i, 1);
if(strcasecmp($sCharacter, "\"") === 0) // Quoted string starts
{
// Append to string untill closing quote found
$bValueClosed = false;
$sValue = '';
while($bValueClosed === false)
{
$i++;
if((strlen($sContent) - 1) < $i) // EOF
{
$bValueClosed = true;
$aColumns[] = $sValue; // Save current column
$aRows[] = $aColumns; // Save current row
}
else
{
$sCharacter = substr($sContent, $i, 1);
if(strcasecmp($sCharacter, "\"") === 0)
{
if((strlen($sContent) - 1) < ($i + 1)) // EOF
{
$bValueClosed = true;
$aColumns[] = $sValue; // Save current column
$aRows[] = $aColumns; // Save current row
$aColumns = array();
}
else
{
// Check for "" (Microsoft quote support).
$sCharacterNext = substr($sContent, $i + 1, 1);
if(strcasecmp($sCharacterNext, "\"") === 0)
{
$sValue .= '"';
$i++;
}
else
{
$bValueClosed = true;
$aColumns[] = $sValue; // Save current column
$i++;
// Remove characters after the quote, probably characters such as spaces/tabs/etc.
$sCharacterNext = substr($sContent, $i, 1); // Lookup next seperator sign or linebreak.
while((in_array($sCharacterNext, $aSeperators) === false) && (strcasecmp($sCharacterNext, "\n") !== 0))
{
$i++;
$sCharacterNext = substr($sContent, $i, 1);
}
if(strcasecmp($sCharacterNext, "\n") === 0)
{
$aRows[] = $aColumns; // Save current row
$aColumns = array();
}
}
}
}
else
{
$sValue .= $sCharacter;
}
}
}
$sValue = '';
}
elseif(in_array($sCharacter, $aSeperators)) // Column seperator character
{
$aColumns[] = trim($sValue); // Save current column
$sValue = '';
}
elseif(strcasecmp($sCharacter, "\n") === 0) // New line character
{
if($bSkipEmptyLines && ((strcasecmp($sValue, "") === 0) || (strcasecmp($sValue, "\r") === 0)) && (sizeof($aColumns) === 0))
{
// Ignore line
$sValue = '';
$iLineCount++;
}
else
{
$aColumns[] = trim($sValue); // Save current column
$aRows[] = $aColumns; // Save current row
$aColumns = array();
$sValue = '';
$iLineCount++;
}
}
elseif(strcasecmp($sCharacter, "\r") !== 0)
{
$sValue .= $sCharacter;
}
}
}
else
{
if($bReportErrors)
{
echo 'File ' . htmlentities($sFilePath) . ' is not readable. FILE: ' . __FILE__ . ', LINE: ' . __LINE__;
}
}
}
else
{
if($bReportErrors)
{
echo 'File ' . htmlentities($sFilePath) . ' has no data. FILE: ' . __FILE__ . ', LINE: ' . __LINE__;
}
}
}
else
{
if($bReportErrors)
{
echo 'File ' . htmlentities($sFilePath) . ' does not exists. FILE: ' . __FILE__ . ', LINE: ' . __LINE__;
}
}
}
else
{
if($bReportErrors)
{
echo 'No filepath given. FILE: ' . __FILE__ . ', LINE: ' . __LINE__;
}
}
return $aRows;
}
?>
Reacties
0