Ici, un petit code PHPpour générer des codes uniques : sans certains caractères et avec 8 digits. Le tout est exporté sous format csv et en 2 colonnes. La dexuxième colonnes étant un pourcentage du nombre total de codes à générer.
/**
* Génère $quantity codes uniques de $length caractères,
* en excluant les caractères de $exclude.
* $existing permet de partager l'unicité entre plusieurs appels (colonne A + colonne B).
*/
function generate_unique_codes(int $quantity, int $length, array $exclude, array &$existing = []): array
{
// Alphabet : chiffres + majuscules uniquement (pas de minuscules => pas d'ambiguïté de casse)
$alphabet = array_merge(range('0', '9'), range('A', 'Z'));
$exclude = array_map('strtoupper', $exclude);
$alphabet = array_values(array_diff($alphabet, $exclude));
$size = count($alphabet);
if ($size < 2) {
throw new RuntimeException('Alphabet trop réduit après exclusion.');
}
$codes = [];
$count = 0;
while ($count < $quantity) {
$code = '';
for ($i = 0; $i < $length; $i++) {
$code .= $alphabet[random_int(0, $size - 1)];
}
if (!isset($existing[$code])) {
$existing[$code] = true;
$codes[] = $code;
$count++;
}
}
return $codes;
}
// --- Paramètres ---
$length = 8;
$totalA = 126000;
$totalB = (int) round($totalA * 0.20); // 25 200
$excludedChars = ['0', 'O', 'I', '1', '8', 'B', '3'];
$existing = []; // set partagé => garantit qu'aucun code de B ne redouble un code de A
$codesA = generate_unique_codes($totalA, $length, $excludedChars, $existing);
$codesB = generate_unique_codes($totalB, $length, $excludedChars, $existing);
// --- Écriture CSV directe sur disque (peu de mémoire utilisée) ---
$filename = 'entremont-' . date('Y-m-d') . '.csv';
$fp = fopen($filename, 'w');
fwrite($fp, "\xEF\xBB\xBF"); // BOM pour Excel
fputcsv($fp, ['Code A', 'Code B'], ';');
$max = max($totalA, $totalB);
for ($i = 0; $i < $max; $i++) {
fputcsv($fp, [$codesA[$i] ?? '', $codesB[$i] ?? ''], ';');
}
fclose($fp);
echo "Fichier généré : $filename\n";
echo "Colonne A : " . count($codesA) . " codes\n";
echo "Colonne B : " . count($codesB) . " codes\n";