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
Nog geen reacties.