#!/usr/bin/env node const fs = require('fs'); const path = require('path'); const Database = require('better-sqlite3'); const csvPath = process.argv[2] || 'database/deathwatch_skills_p94_107.csv'; if (!fs.existsSync(csvPath)) { console.error('CSV not found at', csvPath); process.exit(1); } function splitCsvLine(line){ // split on commas not inside quotes const parts = line.split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/g).map(s=>s.trim()); return parts.map(p => { if (p.startsWith('"') && p.endsWith('"')){ p = p.slice(1,-1).replace(/""/g,'"'); } return p; }); } const raw = fs.readFileSync(csvPath, 'utf8'); const lines = raw.split(/\r?\n/).filter(l => l.trim() !== ''); if (lines.length < 2){ console.error('CSV has no data'); process.exit(1); } const header = splitCsvLine(lines.shift()).map(h=>h.trim()); const rows = lines.map(l => { const cols = splitCsvLine(l); const obj = {}; for(let i=0;i{ const delRes = deleteStmt.run('skills'); console.log('Deleted rows where category=skills, changes:', delRes.changes); let inserted = 0; for(const r of rows){ const name = r.name || r.title || ''; const ruleId = slug(name) || ('skill-' + Math.random().toString(36).slice(2,9)); const contentParts = []; if (r.skill_text && r.skill_text.trim()) contentParts.push(r.skill_text.trim()); if (r.skill_description && r.skill_description.trim()) contentParts.push(r.skill_description.trim()); if (r.skill_use && r.skill_use.trim()) contentParts.push('Use: ' + r.skill_use.trim()); const content = contentParts.join('\n\n'); const page = null; const res = insertStmt.run(ruleId, name, content, page, 'csv-import', 'CSV', 'skills'); if (res.changes) inserted++; } console.log('Inserted', inserted, 'new skill rows'); }); try{ tx(); }catch(err){ console.error('DB error during import', err && err.message); process.exit(1); }finally{ const counts = db.prepare('SELECT COUNT(*) as c FROM rules WHERE category = ?').get('skills').c; console.log('Final skills count in rules table:', counts); db.close(); }