function csvParseDuplicate(text, {empty = "_default", dedup = (name, j) => `${name}~${j}`} = {}) {
const columns = [];
return Object.assign(d3.csvParseRows(text, (row, i) => {
if (i === 0) {
for (let name of row) {
let n = name || (name = empty);
let j = 0;
while (columns.includes(n)) n = dedup(name, ++j);
columns.push(n);
}
return;
}
return Object.fromEntries(columns.map((c, i) => [c, row[i]]));
}), {columns});
}