Created
August 16, 2020 17:19
-
-
Save johncalvinroberts/e85cc7b6518209337ed88b2a6180f18d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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