CSV bestanden parsen

Door Martijn Wieringa, 17 jaar geleden, 3.781x bekeken

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.

Gesponsorde koppelingen

PHP script bestanden

  1. csv-bestanden-parsen

 

Er zijn 9 reacties op 'Csv bestanden parsen'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Eris -
Eris -
17 jaar geleden
 
0 +1 -0 -1
Ziet er goed uit ;)
PHP Newbie
PHP Newbie
17 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
    if(strcasecmp($sFilePath, "") !== 0)
    {

        if(is_file($sFilePath))
        {

            if(filesize($sFilePath) > 0)
            {

                //iets
            }
            else
            {
                //echo iets
            }
        }

        else
        {
            //echo iets
        }
    }

    else
    {
        //echo iets
    }
?>


Klein tipje: dit geeft onderaan (bij de else) steeds de error melding, en is vaak niet echt handig.

Misschien een om het volgende keer zo te doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
    if(strcasecmp($sFilePath, "") == 0)
    {

        //echo iets
    }
    else
    {
        if(!is_file($sFilePath))
        {

            //echo iets
        }
        else
        {
            if(filesize($sFilePath) < 0)
            {

                //echo iets
            }
            else
            {
                //iets
            }
        {
    }

?>


Op deze manier kun je een beetje zien welke errors waarbij horen. Je krijgt nu de error melding mooi direct na de if.

Je kunt het ook oplossen door commentaar bij de ifjes en elsejes te zitten.

Verder lijkt het me een leuk script :-)
Steff   an
Steff an
17 jaar geleden
 
0 +1 -0 -1
Volgens mij moet dit makkelijker en sneller kunnen, met minder code.

@PHP Newbie
Volgens mij is dat gewoon een kwestie van smaak.
Jelmer -
Jelmer -
17 jaar geleden
 
0 +1 -0 -1
De alternatieve manier is volgens mij een hele goeie preg_match_all, maar ik ga die lekker niet schrijven >:)

Wel apart op zich. Als ik het probleem hoor zit ik meteen te denken aan file() en explode(), maar dan zou je al die features zoals enters en 'strings' (dingen tussen quotes) niet mogelijk zijn.

voor error-afhandeling raad ik trouwens trigger_error in dit geval aan. Dan kan je de fouten laten afhandelen door de interne PHP errorhandler (of je eigen!). Er is nu geen manier om met de uitvoer van de functie te bepalen wat er nu precies mis ging. Als je trigger_error en een unieke code meegeeft, is het wel mogelijk.
Remco van Arkelen
Remco van Arkelen
17 jaar geleden
 
0 +1 -0 -1
Ben je bekend met de functie fgetcsv? Volgens mij kan deze 90% van de zaken die je nu hebt gebouwd, verbeter me/vul me aan als ik het mis heb, 'k heb je script nog niet geprobeerd :)
Martijn Wieringa
Martijn Wieringa
17 jaar geleden
 
0 +1 -0 -1
Hmm, van de fgetcsv functie had ik nog nooit gehoord.. hmm :)
és ff kijken wat voor mogelijkheden dat allemaal bied!

@Steffan: Ongetwijffeld kan de code iets compacter geschreven worden.. ik zou zeggen, leef je uit (:, ik verkies doorgaans leesbaardere code boven compacte code, zeker gezien code eigenlijk nooit 'af' is..

Ik heb gezocht naar oplossingen kwa regex.. maar deze wordt dan zó complex.. zo'n regex goeroe ben'k nu ook weer niet :P
Niek s
niek s
17 jaar geleden
 
0 +1 -0 -1
maar wat kan je met een csv? wat voor bestanden zijn daT?
Legolas
Legolas
17 jaar geleden
 
0 +1 -0 -1
comma separated values... al enig idee? :P
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Martijn Wieringa
Martijn Wieringa
17 jaar geleden
 
0 +1 -0 -1
Nagenoeg hetzelfde script, opnieuw schreven; maar dan een stuk compacter!

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php

    function csvToArray($sFilePath = "")
    {

        // 2d array that stores the result
        $aRows = array();

        if((strcasecmp($sFilePath, "") !== 0) && (is_file($sFilePath)) && (filesize($sFilePath) > 0) && (is_readable($sFilePath)))
        {

            // Valid seperator signs
            $aSeperators = array(",", ";");

            // Load CSV data
            $sData = file_get_contents($sFilePath);

            // Split data into lines
            $sExpr = '/((?:["][^"]*["])+|[^\n]+)+/';

            $matches = array();
            preg_match_all($sExpr, $sData, $matches);
            $aLines = $matches[0];

            // For each line
            for($i = 0; $i < sizeof($aLines); $i++)
            {

                $sLine = $aLines[$i];

                // Array that stores each field in the row
                $aRow = array();

                // Split line into fields
                $sExpr = '/[\s]*((?:(?:["][^"]*["])+)|(?:[^' . implode("", $aSeperators) . '"]+))[\s]*[' . implode("", $aSeperators) . ']?/';

                $matches = array();
                preg_match_all($sExpr, $sLine, $matches);
                $aFields = $matches[1];

                // For each field
                for($j = 0; $j < sizeof($aFields); $j++)
                {

                    $sValue = trim($aFields[$j]);

                    if(substr($sValue, 0, 1) == '"') // Value starts with a quote.
                    {
                        $sValue = substr($sValue, 1, -1); // Strip start/close quote.
                        $sValue = str_replace('""', '"', $sValue); // Replace inline "" for ".
                    }

                    // Add value to row
                    $aRow[] = $sValue;
                }


                // Add row to result
                $aRows[] = $aRow;
            }
        }


        return $aRows;
    }


?>

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. csv-bestanden-parsen

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.