Skip to content

Instantly share code, notes, and snippets.

@johncalvinroberts
Created August 16, 2020 17:19
Show Gist options
  • Save johncalvinroberts/e85cc7b6518209337ed88b2a6180f18d to your computer and use it in GitHub Desktop.
Save johncalvinroberts/e85cc7b6518209337ed88b2a6180f18d to your computer and use it in GitHub Desktop.
const fs = require("fs");
const { promisify } = require("util");
const pp = require("papaparse");
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);
const mutateMemoForPerson = (memo, person, pricePerPerson, title) => {
const maybeCouple = person.split("*");
if (maybeCouple.length > 1) {
return maybeCouple.map((subperson) =>
mutateMemoForPerson(
memo,
subperson,
pricePerPerson / maybeCouple.length,
title
)
);
}
const previousPerson = memo[person] || { total: 0, expenses: [] };
const nextPerson = {
total: previousPerson.total + pricePerPerson,
expenses: [...previousPerson.expenses, { title, pricePerPerson }],
};
memo[person] = nextPerson;
};
(async () => {
try {
const file = await readFile("./quzhou.csv");
const {
data: [, ...allExpenses],
} = await pp.parse(file.toString());
const pricedPerPerson = allExpenses.reduce((memo, current) => {
const [title, priceString, personsString] = current;
const personsBillable = personsString.split(", ");
const price = parseInt(priceString);
const pricePerPerson = price / personsBillable.length;
for (const person of personsBillable) {
mutateMemoForPerson(memo, person, pricePerPerson, title);
}
return memo;
}, {});
for (const [key, value] of Object.entries(pricedPerPerson)) {
const template = `
Quzhou Expenses for ${key}
${value.expenses
.map(({ title, pricePerPerson }) => `* ${title} CN¥${pricePerPerson})`)
.join("\n")}
Total: CN¥${value.total}
`;
await writeFile(`people/${key}.txt`, template);
}
} catch (error) {
console.log({ error });
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment