PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); $pdo->exec(" CREATE TABLE IF NOT EXISTS `spacecraft_tracks` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `mission_key` varchar(64) NOT NULL, `mission_name` varchar(128) NOT NULL, `date_tdb` datetime NOT NULL, `jd_tdb` decimal(16,9) NOT NULL, `x_km` double NOT NULL, `y_km` double NOT NULL, `z_km` double NOT NULL, `vx_km_s` double NOT NULL, `vy_km_s` double NOT NULL, `vz_km_s` double NOT NULL, `distance_km` double NOT NULL, `distance_au` double NOT NULL, `created_at` datetime NOT NULL DEFAULT current_timestamp(), `updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`id`), UNIQUE KEY `uq_spacecraft_tracks_mission_date` (`mission_key`,`date_tdb`), KEY `idx_spacecraft_tracks_mission_key` (`mission_key`), KEY `idx_spacecraft_tracks_date_tdb` (`date_tdb`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Sonnenzentrierte Horizons-Vektoren fuer Raumsonden' "); $missions = [ [ 'key' => 'voyager1', 'name' => 'Voyager 1', 'csv' => __DIR__ . '/../../docs/voyager1_horizons_1977_2046_monthly_sun_centered.csv', ], [ 'key' => 'voyager2', 'name' => 'Voyager 2', 'csv' => __DIR__ . '/../../docs/voyager2_horizons_1977_2046_monthly_sun_centered.csv', ], [ 'key' => 'new_horizons', 'name' => 'New Horizons', 'csv' => __DIR__ . '/../../docs/new_horizons_2006_2046_monthly_sun_centered.csv', ], ]; $insertStatement = $pdo->prepare(" INSERT INTO `spacecraft_tracks` ( `mission_key`, `mission_name`, `date_tdb`, `jd_tdb`, `x_km`, `y_km`, `z_km`, `vx_km_s`, `vy_km_s`, `vz_km_s`, `distance_km`, `distance_au` ) VALUES ( :mission_key, :mission_name, :date_tdb, :jd_tdb, :x_km, :y_km, :z_km, :vx_km_s, :vy_km_s, :vz_km_s, :distance_km, :distance_au ) ON DUPLICATE KEY UPDATE `mission_name` = VALUES(`mission_name`), `jd_tdb` = VALUES(`jd_tdb`), `x_km` = VALUES(`x_km`), `y_km` = VALUES(`y_km`), `z_km` = VALUES(`z_km`), `vx_km_s` = VALUES(`vx_km_s`), `vy_km_s` = VALUES(`vy_km_s`), `vz_km_s` = VALUES(`vz_km_s`), `distance_km` = VALUES(`distance_km`), `distance_au` = VALUES(`distance_au`) "); foreach ($missions as $mission) { if (!is_file($mission['csv'])) { throw new RuntimeException('CSV-Datei nicht gefunden: ' . $mission['csv']); } $handle = fopen($mission['csv'], 'rb'); if ($handle === false) { throw new RuntimeException('CSV-Datei konnte nicht geoeffnet werden: ' . $mission['csv']); } $header = fgetcsv($handle, 0, ',', '"', '\\'); if ($header === false) { fclose($handle); throw new RuntimeException('CSV-Kopf konnte nicht gelesen werden: ' . $mission['csv']); } $count = 0; while (($values = fgetcsv($handle, 0, ',', '"', '\\')) !== false) { if (count($values) !== count($header)) { continue; } $row = array_combine($header, $values); if (!is_array($row)) { continue; } $dateTdbRaw = trim((string) ($row['date_tdb'] ?? '')); $dateTdbNormalized = preg_replace('/^A\.D\.\s+/i', '', $dateTdbRaw) ?? $dateTdbRaw; $date = DateTimeImmutable::createFromFormat('Y-M-d H:i:s.u', $dateTdbNormalized, new DateTimeZone('UTC')); if (!$date instanceof DateTimeImmutable) { continue; } $insertStatement->execute([ ':mission_key' => $mission['key'], ':mission_name' => $mission['name'], ':date_tdb' => $date->format('Y-m-d H:i:s'), ':jd_tdb' => (float) $row['jd_tdb'], ':x_km' => (float) $row['x_km'], ':y_km' => (float) $row['y_km'], ':z_km' => (float) $row['z_km'], ':vx_km_s' => (float) $row['vx_km_s'], ':vy_km_s' => (float) $row['vy_km_s'], ':vz_km_s' => (float) $row['vz_km_s'], ':distance_km' => (float) $row['distance_km'], ':distance_au' => (float) $row['distance_au'], ]); $count++; } fclose($handle); echo $mission['name'] . ': ' . $count . " Zeilen importiert.\n"; } echo "Import abgeschlossen.\n";