70 lines
2.5 KiB
TypeScript
70 lines
2.5 KiB
TypeScript
#!/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 <buyers_vision.json> [--overwrite]");
|
|
process.exit(1);
|
|
}
|
|
|
|
const raw = await fsp.readFile(file, "utf8");
|
|
const records: Array<Record<string, unknown>> = 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); }); |