La source exacte l'emporte, et les noms provisoires disparaissent

Un module extrait par --historique-distant porte des horodatages lus
au chronometre ; ses vieux exports texte reposent sur une deduction.
Importer les deux pour le meme module poserait deux series decalees de
plusieurs heures, illisibles. L'importeur ecarte donc le texte des
qu'un releve exact existe pour ce code-barres.

--remplacer efface aussi les lignes rangees sous un nom provisoire du
type pack_ancien:2, sans quoi le module nomme et son fantome
coexisteraient dans les listes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-09-05 16:28:16 +02:00
parent 8d076603de
commit ed9e72c23b
2 changed files with 422 additions and 0 deletions

View File

@@ -175,6 +175,17 @@ for (const m of motifs) {
}
if (!fichiers.length) { console.error('Aucun fichier.'); process.exit(1); }
// Un module extrait par `--historique-distant` a des horodatages EXACTS (le
// decalage est lu au chronometre). Ses vieux exports texte, eux, reposent sur
// une deduction. Importer les deux pour le meme module poserait deux series
// decalees de plusieurs heures l'une de l'autre, et les courbes seraient
// illisibles. La source exacte gagne, quitte a perdre quelques enregistrements.
const exacts = new Set();
for (const f of fichiers) {
const m = path.basename(f).match(/-histo-distant-(\S+?)\.csv$/);
if (m) exacts.add(m[1]);
}
const paquets = [];
for (const f of fichiers.sort()) {
const n = path.basename(f);
@@ -186,6 +197,11 @@ for (const f of fichiers.sort()) {
const r = lireSuivi(f);
if (r) { paquets.push(r.lignes); console.log(` ${n} suivi, ${r.lignes.length / 15} releves, modules ${r.modules.join(' ')}`); }
} else if (/histor/i.test(n) && n.endsWith('.txt')) {
const bc = (lireTexte(f).match(/Barcode\s*:\s*(\S+)/) || [])[1];
if (bc && exacts.has(bc)) {
console.log(` ${n} ecarte : ${bc} a un releve horodate a l'export`);
continue;
}
// Les exports d'EVENEMENTS portent les memes colonnes mais decrivent des
// declenchements, pas un echantillonnage regulier : les melanger ferait
// des courbes fausses.
@@ -218,6 +234,11 @@ await client.connect();
// source. Sans cela, corriger un decalage d'horloge AJOUTE une seconde copie
// decalee au lieu de remplacer la premiere — la cle primaire porte l'instant.
if (args.includes('--remplacer')) {
// Les noms provisoires de la forme `pack_ancien:2` datent d'avant que le
// code-barres du module soit connu. Une fois nomme, l'ancien nom ferait un
// module fantome dans les listes.
const prov = await client.query("DELETE FROM cellule WHERE module LIKE '%:%'");
if (prov.rowCount) console.log(` efface ${prov.rowCount} lignes sous un nom provisoire`);
const paires = [...new Set(toutes.map((l) => l[1] + '\u0000' + l[7]))]
.map((x) => x.split('\u0000'));
for (const [mod, src] of paires) {