loadCsvFile($file, $manager, $year); } } $manager->flush(); } private function loadCsvFile(string $filePath, ObjectManager $manager, int $year): void { echo "Chargement du fichier : $filePath\n"; $i = 0; // Lire le fichier CSV if (($handle = fopen($filePath, 'r')) !== false) { // Lire la première ligne pour obtenir les en-têtes $headers = fgetcsv($handle, 1000, ','); if ($headers === false) { throw new \Exception("Impossible de lire les en-têtes du fichier $filePath."); } // Lire chaque ligne de données while (($data = fgetcsv($handle, 1000, ',')) !== false) { $i = $i + 1; $this->createImpotFromRow($data, $manager, $year); // Evite de surchager la mémoire du PC if ($i % 10000 == 0) { $manager->flush(); $manager->clear(); } } fclose($handle); } } private function createImpotFromRow(array $row, ObjectManager $manager, int $year): void { // On associe un type d'impôts en fonction de l'indice des colonnes du fichier CSV $map = [ 'Taxe d\'habitation' => ['taxRateIndex' => 3, 'volumeIndex' => 4], 'CFE' => ['taxRateIndex' => 5, 'volumeIndex' => 6], 'TFB' => ['taxRateIndex' => 7, 'volumeIndex' => 8], 'TFNB' => ['taxRateIndex' => 9, 'volumeIndex' => 10], ]; foreach ($map as $type => $indices) { $impot = new Impot(); $impot->setType($type); $impot->setRegion($row[12]); // Colonne 12 = LIBREG $impot->setDepartment($row[0]); // Colonne 0 = DEP $impot->setCommune($row[2]); // Colonne 2 = LIBCOM $impot->setYear($year); $impot->setTaxRate((float) $row[$indices['taxRateIndex']]); // Taux d'impôt $impot->setVolumeCollected((float) $row[$indices['volumeIndex']]); // Volume collecté $manager->persist($impot); } } }