From e46f00c838f5ef59dff4add09b258dcc8da4dc6d Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Tue, 14 Jul 2026 18:52:19 -0500 Subject: [PATCH] new --- add_name_from_filename.ts | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 add_name_from_filename.ts diff --git a/add_name_from_filename.ts b/add_name_from_filename.ts new file mode 100644 index 0000000..6258b3c --- /dev/null +++ b/add_name_from_filename.ts @@ -0,0 +1,70 @@ +#!/usr/bin/env npx tsx +/** + * add_name_from_filename.ts + * + * Traegt das Feld "name_from_filename" in eine bestehende buyers_vision.json + * nach, OHNE die Vision-Ergebnisse anzufassen und OHNE GPU/Neuverarbeitung. + * Nutzt exakt dieselbe Logik wie der vision_runner, damit die Werte + * identisch zu kuenftigen Laeufen sind. + * + * Aufruf: + * npx tsx add_name_from_filename.ts out_Z/buyers_vision.json + * npx tsx add_name_from_filename.ts out_Z/buyers_vision.json --overwrite + * + * Ohne --overwrite werden nur Datensaetze ergaenzt, die das Feld noch nicht + * (oder null) haben. Ein Backup .bak wird immer angelegt. + */ +import { promises as fsp } from "node:fs"; + +// IDENTISCH zur Funktion im vision_runner.ts +function nameFromFilename(fileName: string): string | null { + let s = fileName.replace(/\.pdf$/i, ""); + s = s.replace(/\([^)]*\)/g, " ").replace(/\s+/g, " ").trim(); + const comma = s.indexOf(","); + if (comma < 0) { + const first = s.replace(/\b\d{4,8}\b.*$/, "").trim(); + return first.length >= 2 ? first : null; + } + const last = s.slice(0, comma).trim(); + const rest = s.slice(comma + 1).trim(); + const firstName = (rest.match(/^[A-Za-zÀ-ÿ.'-]+/) || [""])[0]; + if (!last || !firstName) return null; + return `${last}, ${firstName}`; +} + +async function main() { + const args = process.argv.slice(2); + const file = args.find((a) => !a.startsWith("--")); + const overwrite = args.includes("--overwrite"); + if (!file) { + console.error("Aufruf: npx tsx add_name_from_filename.ts [--overwrite]"); + process.exit(1); + } + + const raw = await fsp.readFile(file, "utf8"); + const records: Array> = JSON.parse(raw); + + // Backup + await fsp.writeFile(file + ".bak", raw); + + let added = 0, skipped = 0, unchanged = 0; + for (const r of records) { + const fn = r["file_name"] as string | undefined; + if (!fn) { skipped++; continue; } + const has = r["name_from_filename"] != null && r["name_from_filename"] !== ""; + if (has && !overwrite) { unchanged++; continue; } + const val = nameFromFilename(fn); + if (r["name_from_filename"] === val) { unchanged++; continue; } + r["name_from_filename"] = val; + added++; + } + + await fsp.writeFile(file, JSON.stringify(records, null, 2)); + console.log(`Datensaetze: ${records.length}`); + console.log(`Feld gesetzt: ${added}`); + console.log(`schon vorhanden: ${unchanged}`); + console.log(`ohne file_name: ${skipped}`); + console.log(`Backup: ${file}.bak`); +} + +main().catch((e) => { console.error(e); process.exit(1); }); \ No newline at end of file