new
This commit is contained in:
70
add_name_from_filename.ts
Normal file
70
add_name_from_filename.ts
Normal file
@@ -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 <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); });
|
||||
Reference in New Issue
Block a user