Projekt

Obecné

Profil

« Předchozí | Další » 

Revize a257bb07

Přidáno uživatelem horkym před asi 7 roky(ů)

#6350: Parsovani dat

Pridano nacteni dat z extrahovanych souboru a jejich ulozeni do vhodne struktury. K tomuto ucelu pridana trida pro zaznam o doprave a trida pro zaznam o lokaci.

Zobrazit rozdíly:

cron/parser.php
1 1
<?php
2 2

  
3
require_once "traffic.php";
4
require_once "location.php";
5

  
3 6
class Parser {
4 7
    
8
    // Pro data o doprave - na kolik intervalu se ma rozdelit den (96 = 4 * 24 => intervaly po ctvrt hodine).
9
    private $HOW_MANY_INTERVALS = 96;
10
    
11
    // Pro data o doprave - jak dlouho v milisekundach trva jeden interval.
12
    private $intervalMilli;
13
    
5 14
    private $name;
6 15
    private $path;
7 16
    
17
    // Pole informaci o lokacich.
18
    private $locations;
19
    
20
    // Pole informaci o doprave - peti-rozmerne pole s nasledujici strukturou:
21
    // Zaklad tvori pole zarizeni. Pro kazde zarizeni je pak pole pro casove intervaly.
22
    // Kazdy casovy interval ma pole o dvou prvcich (dva smery). Pro kazdy smer je vytvoreno pole o jedenacti
23
    // prvcich (jedenact typu vozidel). Pro kazde vozidlo je vytvoreno pole o dvou prvcich (pocet vozidel, suma rychlosti).
24
    private $traffic;
25
    
8 26
    public function __construct() {
9 27
        $this->name = "DOPR_D_";
10 28
        $this->path = "http://doprava.plzensky-kraj.cz/opendata/doprava/den/".$this->name;
29
        
30
        // Pro lokace se data predzpracovavat nemusi.
31
        $this->locations = array();
32
        
33
        // Naopak u zaznamu je prilis zbytecnych informaci - k predzpracovani dojit musi.
34
        $this->intervalMilli = (int) (24 * 3600000 / $this->HOW_MANY_INTERVALS);
35
        $this->traffic = array();
11 36
    }
12 37
    
13 38
    public function doWork($date) {
......
25 50
            }
26 51
            
27 52
            if ($ok == 0 || $result == 1) {
28
                // TODO zpracovani souboru.
53
                $this->parse($dir.$this->name.$date.".csv", TRUE);
54
                $this->parse($dir."Locations.csv", FALSE);
29 55
                // return; odkomentovat v pripade, ze extrahovana data nemaji byt odstranena.
30 56
            }
31 57
            
......
34 60
        }
35 61
    }
36 62
    
63
    private function parse($fileName, $traffic) {
64
        if (($file = fopen($fileName, "r"))) {
65
            while (($row = fgetcsv($file, 1000, "|"))) {
66
                if ($traffic) {
67
                    $this->saveVehicleInfo(new Traffic($row));
68
                } else {
69
                    $this->locations[] = new Location($row);
70
                }
71
            }
72
            fclose($file);
73
        }
74
    }
75
    
76
    private function saveVehicleInfo($t) {
77
        // Kontrola, jestli je pro dane zarizeni vytvorene pole casu.
78
        if (!isSet($this->traffic[$t->device])) {
79
            $this->traffic[$t->device] = array();
80
            for ($i = 0; $i < $this->HOW_MANY_INTERVALS; $i++) {
81
                $this->traffic[$t->device][$i] = NULL;
82
            }
83
        }
84
        
85
        // Zjisteni, do jakeho casoveho intervalu patri zaznam.
86
        list($date, $time) = explode(" ", $t->dateTime->format("Y-m-d H:i:s.u"), 2);
87
        list($hours, $minutes, $seconds) = explode(":", $time, 3);
88
        $interval = (int) (($hours * 3600000 + $minutes * 60000 + $seconds * 1000) / $this->intervalMilli);
89
        
90
        // Kontrola, jestli je pro dany casovy interval vytvorene pole pro smery.
91
        if ($this->traffic[$t->device][$interval] == NULL) {
92
            $this->traffic[$t->device][$interval] = array();
93
            for ($i = 0; $i < 2; $i++) {
94
                $this->traffic[$t->device][$interval][$i] = array();
95
                for ($j = 0; $j < 11; $j++) {
96
                    $this->traffic[$t->device][$interval][$i][$j] = array(0, 0); // Pocet danych vozidel, suma jejich rychlosti.
97
                }
98
            }
99
        }
100
        
101
        // Ulozeni dulezitych informaci o danem zaznamu.
102
        $this->traffic[$t->device][$interval][$t->direction][$t->type10][0]++;
103
        $this->traffic[$t->device][$interval][$t->direction][$t->type10][1] += $t->speed;
104
    }
105
    
37 106
    private function download($date, $zipUrl, $dir, $downloaded) {
38 107
        if (strpos(get_headers($zipUrl, 1)[0], "404") === FALSE) {
39 108
            if (!file_exists($dir)) {
......
90 159
        }
91 160
    }
92 161
    
162
    public function getTraffic() {
163
        return $this->traffic;
164
    }
165
    
166
    public function getLocations() {
167
        return $this->locations;
168
    }
169
    
93 170
}
94 171

  
95 172
?>

Také k dispozici: Unified diff