mirror of
https://github.com/lynchmarkHQ/lynchmark.com.git
synced 2026-10-14 08:07:53 +00:00
20 lines
872 B
JavaScript
20 lines
872 B
JavaScript
let cache;
|
|
async function processCSV(csv,cfg){
|
|
const {csvParse,rollups}=await (cache??=import('https://cdn.jsdelivr.net/npm/d3@7/+esm'));
|
|
const {filterColumn,filterValue,groupBy,aggregateColumn,operation}=cfg;
|
|
if(!['sum','avg','count'].includes(operation))throw new Error('Unsupported operation');
|
|
if(!csv||!filterColumn||!groupBy)throw new Error('Missing essentials');
|
|
if(operation!=='count'&&!aggregateColumn)throw new Error('Missing aggregateColumn');
|
|
const rows=csvParse(csv).filter(r=>r[filterColumn]==filterValue);
|
|
if(!rows.length)return[];
|
|
const fn=operation==='count'?v=>v.length:v=>{
|
|
let s=0,n=0;
|
|
for(const row of v){
|
|
const val=+row[aggregateColumn];
|
|
if(!Number.isNaN(val)){s+=val;n++;}
|
|
}
|
|
return operation==='sum'?s:n?s/n:0;
|
|
};
|
|
return rollups(rows,fn,r=>r[groupBy]).map(([k,v])=>({[groupBy]:k,[operation]:v}));
|
|
}
|
|
export default processCSV; |