parent
67a8582c22
commit
03bd478aaa
4 changed files with 142 additions and 2 deletions
@ -0,0 +1,129 @@ |
||||
const csv = require('csv-parser'); |
||||
const fs = require('fs'); |
||||
const path = require('path'); |
||||
|
||||
const csvFilePath = path.join(__dirname, '../data.csv'); |
||||
|
||||
const results = {}; |
||||
const pageSummary = {}; |
||||
|
||||
fs.createReadStream(csvFilePath) |
||||
.pipe( |
||||
csv({ |
||||
separator: ',', |
||||
mapHeaders: ({ header, index }) => |
||||
header.toLowerCase().replace(/ /g, '_'), |
||||
mapValues: ({ header, index, value }) => { |
||||
if (header === 'page') { |
||||
return ( |
||||
value |
||||
.replace(/"/g, '') |
||||
.replace(/'/g, '') |
||||
.replace(/`/g, '') |
||||
.replace(/\?r=/g, '#r#') |
||||
.replace(/\?.+?$/g, '') |
||||
.replace(/#r#/g, '?r=') |
||||
.replace(/\/$/g, '') || '/' |
||||
); |
||||
} |
||||
|
||||
if (header !== 'month_of_year') { |
||||
return parseInt(value, 10); |
||||
} |
||||
|
||||
return value; |
||||
}, |
||||
}) |
||||
) |
||||
.on('data', (data) => { |
||||
const { page, month_of_year, unique_pageviews, users } = data; |
||||
const pageData = results[page] || {}; |
||||
const existingPageMonthData = pageData[month_of_year] || {}; |
||||
|
||||
const existingViews = existingPageMonthData.views || 0; |
||||
const existingUsers = existingPageMonthData.users || 0; |
||||
|
||||
const newViews = existingViews + unique_pageviews; |
||||
const newUsers = existingUsers + users; |
||||
|
||||
pageData[month_of_year] = { |
||||
views: newViews, |
||||
users: newUsers, |
||||
}; |
||||
|
||||
results[page] = pageData; |
||||
|
||||
pageSummary[page] = pageSummary[page] || { views: 0, users: 0 }; |
||||
pageSummary[page].views += unique_pageviews; |
||||
pageSummary[page].users += users; |
||||
}) |
||||
.on('end', () => { |
||||
const csvHeader = [ |
||||
'Page', |
||||
'Jan 2022', |
||||
'Feb 2022', |
||||
'Mar 2022', |
||||
'Apr 2022', |
||||
'May 2022', |
||||
'Jun 2022', |
||||
'Jul 2022', |
||||
'Aug 2022', |
||||
'Sep 2022', |
||||
'Oct 2022', |
||||
'Nov 2022', |
||||
'Dec 2022', |
||||
'Jan 2023', |
||||
'Feb 2023', |
||||
'Mar 2023', |
||||
'Apr 2023', |
||||
'May 2023', |
||||
'Jun 2023', |
||||
'Jul 2023', |
||||
'Aug 2023', |
||||
'Sep 2023', |
||||
'Oct 2023', |
||||
'Nov 2023', |
||||
'Dec 2023', |
||||
]; |
||||
|
||||
const csvRows = Object.keys(pageSummary) |
||||
.filter(pageUrl => pageSummary[pageUrl].views > 10) |
||||
.filter(pageUrl => !['/upcoming', '/pdfs', '/signup', '/login', '/@'].includes(pageUrl)) |
||||
.sort((pageA, pageB) => { |
||||
const aViews = pageSummary[pageA].views; |
||||
const bViews = pageSummary[pageB].views; |
||||
|
||||
return bViews - aViews; |
||||
}) |
||||
.map((pageUrl) => { |
||||
const rawPageResult = results[pageUrl]; |
||||
const pageResultCsvRow = []; |
||||
|
||||
csvHeader.forEach((csvHeaderItem) => { |
||||
if (csvHeaderItem === 'Page') { |
||||
pageResultCsvRow.push(pageUrl); |
||||
return; |
||||
} |
||||
|
||||
const csvHeaderItemAlt = csvHeaderItem |
||||
.replace(/ /g, '_') |
||||
.toLowerCase(); |
||||
|
||||
const result = rawPageResult[csvHeaderItem || csvHeaderItemAlt] || {}; |
||||
const views = result.views || 0; |
||||
const users = result.users || 0; |
||||
|
||||
pageResultCsvRow.push(users); |
||||
}); |
||||
|
||||
return pageResultCsvRow; |
||||
}); |
||||
|
||||
const finalCsvRows = [csvHeader, ...csvRows]; |
||||
const csvRowStrings = finalCsvRows.map((row) => { |
||||
return row.join(','); |
||||
}); |
||||
|
||||
const csvString = csvRowStrings.join('\n'); |
||||
fs.writeFileSync(path.join(__dirname, '../data-agg.csv'), csvString); |
||||
}); |
Loading…
Reference in new issue