Files
lynchmark.com/tests/6_csv_processor/outputs/openrouter_polaris-alpha.js
T

30 lines
1.1 KiB
JavaScript

async function processCSV(csv, cfg) {
const {filterColumn,filterValue,groupBy,aggregateColumn,operation} = cfg
if(!csv||!filterColumn||!groupBy||!operation) throw new Error('Invalid configuration')
const [{parse},{default:lodash}] = await Promise.all([
import('https://cdn.jsdelivr.net/npm/papaparse@5.4.1/+esm'),
import('https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/+esm')
])
const {data,errors} = parse(csv,{header:true,skipEmptyLines:true,dynamicTyping:true})
if(errors?.length) throw new Error('CSV parse error')
const rows = data.filter(r=>r[filterColumn]===filterValue)
if(!rows.length) return []
const grouped = lodash.groupBy(rows,r=>r[groupBy])
const out = []
for(const k in grouped){
const g = grouped[k]
let v
if(operation==='count') v = g.length
else{
const nums = g.map(r=>Number(r[aggregateColumn])).filter(n=>Number.isFinite(n))
if(!nums.length) { v = operation==='sum'?0:null }
else{
const s = nums.reduce((a,b)=>a+b,0)
v = operation==='sum'?s:s/nums.length
}
}
out.push({[groupBy]:k,result:v})
}
return out
}
export default processCSV;