gigidenantes Lurkeur compulsif | Bonjour à tous,
une question d'algo pour démarrer la semaine.
J'ai un fichier csv avec 162 colonnes et 55 000 lignes. Je veux l'ordonner par date (qui est en colonne 3).
J'ai d'abord essayé de le mettre dans un tableau et de le trier, mais out of memory...
Ce que j'ai réussi à faire ensuite :
1/ Stocker dans un tableau les 3 1ères colonnes
2/ Ordonner ce tableau avec la date (utilisation de usort)
3/ Parcourir le tableau et lire le fichier pour récupérer les autres colonnes correspondantes à la ligne en cours
4/ Ajouter la ligne complète dans un fichier csv en sortie
5/ Remplacer la ligne par une chaîne vide dans le fichier en lecture
Voici une partie de mon code :
Code :
- //First read of the file
- while(($data = fgetcsv($handle, 0,';')) !== false)
- {
- $tabLigne[$columnNames[0]] = $data[0];
- $tabLigne[$columnNames[1]] = $data[1];
- $tabLigne[$columnNames[2]] = $data[2];
- $dateCreation = DateTime::createFromFormat('d/m/Y', $tabLigne['Date de Création']);
- if($dateCreation !== false)
- {
- $tableauDossiers[$row] = $tabLigne;
- }
- $row++;
- unset($data);
- unset($tabLigne);
- }
- //Order the array by date
- usort(
- $tableauDossiers,
- function($x, $y) {
- $date1 = DateTime::createFromFormat('d/m/Y', $x['Date de Création']);
- $date2 = DateTime::createFromFormat('d/m/Y', $y['Date de Création']);
- return $date1->format('U')> $date2->format('U');
- }
- );
- fclose($handle);
- copy(PATH_CSV.'original_file.csv', PATH_CSV.'copy_of_file.csv');
- for ($row = 3; $row <= count($tableauDossiers); $row++)
- {
- $handle = fopen(PATH_CSV.'copy_of_file.csv', 'c+');
- $tabHandle = file(PATH_CSV.'copy_of_file.csv');
- fgetcsv($handle);
- fgetcsv($handle);
- $rowHandle = 2;
- while(($data = fgetcsv($handle, 0,';')) !== false)
- {
- if($tableauDossiers[$row]['Caisse Locale Déléguée'] == $data[0]
- && $tableauDossiers[$row]['Date de Création'] == $data[1]
- && $tableauDossiers[$row]['Numéro RCT'] == $data[2])
- {
- fputcsv($fichierSortieDossier, $data,';');
- $tabHandle[$rowHandle]=str_replace("\n",'', $tabHandle[$rowHandle]);
- file_put_contents(PATH_CSV.'copy_of_file.csv', $tabHandle);
- unset($tabHandle);
- break;
- }
- $rowHandle++;
- unset($data);
- unset($tabLigne);
- }
- fclose($handle);
- unset($handle);
- }
|
Le résultat attendu est le bon. Mais le problème c'est le temps passé par ce script (déjà plus d'une heure et il n'en a traité que 1/3).
Merci de vos retours. |