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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user