#!/usr/bin/env php
<?php declare(strict_types = 1);
class App
{
/**
* @var PDO|null PDO database instance or null
*/
private $dbInstance = null;
/**
* Einstiegspunkt der App, sowas ähnliches wie die main() anderer Sprachen.
*
* @return int Statuscode
*/
public function run(): int
{
try {
$fileContent = $this->getFileContent();
$fileContent = $this->normalize($fileContent);
$importData = $this->csvToArray($fileContent);
$importData = $this->processData($importData);
foreach ($importData as $row) {
$this->import($row);
}
return 0;
} catch (Exception $e) {
return $e->getCode();
}
}
/**
* Holt sich die CSV und schmeißt sie in einen String.
*
* @return string File content
*/
private function getFileContent(): string
{
$fileContent = file_get_contents(
'http://open-data.noe.gv.at/BD4/Kohlenmonoxid.csv'
);
if (!$fileContent) {
throw new Exception('Cannot download file', 5);
}
return $fileContent;
}
/**
* Konvertiert dir deine Datei in UTF-8 und mit UNIX-Zeilenendungen.
*
* @param string $fileContent File to normalize
* @return string Normalized file
*/
private function normalize(string $fileContent): string
{
if (!mb_check_encoding($fileContent, 'UTF-8')) {
$fileContent = mb_convert_encoding($fileContent, 'UTF-8', 'ISO-8859-1');
}
$fileContent = trim($fileContent);
$fileContent = str_replace("\r\n", "\n", $fileContent);
$fileContent = str_replace("\r", "\n", $fileContent);
return $fileContent;
}
/**
* Konvertiert dir deine CSV in ein Array, damit man besser damit arbeiten kann.
*
* @param string $fileContent File to convert
* @return string Converted file
*/
private function csvToArray(string $fileContent): array
{
foreach (explode("\n", $fileContent) as $element) {
$results[] = str_getcsv($element, ';', "'");
}
return (isset($results)) ? $results : [];
}
/**
* Diese Funktion kannst du nutzen, um die Dateien noch in irgendeiner
* Form zu bearbeiten. Mal noch löscht sie nur das erste Element des
* Arrays, da da nur der Kopf der CSV drin ist.
*
* @param array $data Data to process
* @return array Processed data
*/
private function processData(array $data): array
{
array_splice($data, 0, 1);
return $data;
}
/**
* Schreibt dir alle in dem Array enthaltenen Daten in die DB.
*
* @param array $importData Data to import
*/
private function import(array $importData)
{
$instance = $this->getDBInstance();
$estimatedElements = 27;
if (count($row) != $estimatedElements) {
throw new Exception(
'Count of elements in row != ' . $estimatedElements,
8
);
}
$questionMarks = implode(',', array_fill(0, $estimatedElements, '?'));
$stmt = $instance->prepare(
'INSERT INTO tabelle VALUES (' . $questionMarks . ')'
);
$stmt->execute($row);
}
/**
* Gibt dir ne PDO-Instanz zurück, mit der du deine Querys abfeuern kannst.
*
* @return PDO PDO database instance
*/
private function getDBInstance(): PDO
{
if (is_null($this->dbInstance)) {
$host = '127.0.0.1';
$port = 3306;
$database = 'datenbank';
$user = 'user';
$password = 'pass';
$this->dbInstance = new PDO(
sprintf(
'mysql:host=%s;port=%d;dbname=%s',
$host,
$port,
$database
),
$user,
$password,
array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
)
);
$this->dbInstance->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
}
return $this->dbInstance;
}
}
$app = new App;
exit($app->run());