Skip to content

Instantly share code, notes, and snippets.

@sethetter
Last active June 29, 2017 16:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sethetter/836ef9e9cb43f9c9a45e15ab60615804 to your computer and use it in GitHub Desktop.
Save sethetter/836ef9e9cb43f9c9a45e15ab60615804 to your computer and use it in GitHub Desktop.
const fs = require('fs')
const path = require('path')
const csv = require('csv')
const request = require('request')
const getRemoteFileContent = (url) => {
return new Promise((resolve, reject) => {
request(url, (err, response) => {
if (err) return reject(err)
return resolve(response.body)
})
})
}
// parse the csv into a JSON structure -- { '01': 'KS', ... }
const transformStateFile = (csvData) => {
return new Promise((resolve, reject) => {
csv.parse(csvData, { delimiter: '|', from: 2 }, (err, data) => {
if (err) return reject(err)
return resolve(data.reduce((result, row) => {
result[row[0]] = row[1]
return result
}, {}))
})
})
}
const transformCdZipFile = (csvData, states) => {
return new Promise((resolve, reject) => {
csv.parse(csvData, { from: 2 }, (err, data) => {
if (err) return reject(err)
return resolve(data.reduce((result, row) => {
// Not a valid row if there aren't exactly 3 columns
if (row.length !== 3) return result
const cdKey = `${states[row[0]]}-${row[2]}`
if (!result[cdKey]) result[cdKey] = []
result[cdKey].push(row[1])
return result
}, {}))
})
})
}
const writeDataToFile = (filePath, cdZips) => {
return new Promise((resolve, reject) => {
fs.writeFile(filePath, JSON.stringify(cdZips), (err, result) => {
if (err) return reject(err)
return resolve(result)
})
})
}
getRemoteFileContent('https://www2.census.gov/geo/docs/reference/state.txt')
.then(transformStateFile)
.then(states => {
return getRemoteFileContent('https://www2.census.gov/geo/relfiles/cdsld16/natl/natl_zccd_delim.txt')
// First line of csvData is garbage
.then(csvData => transformCdZipFile(csvData.split('\n').slice(1).join('\n'), states))
})
.then(cdZips => {
return writeDataToFile('./data/cd-zips.json', cdZips)
})
.then(() => { console.log('Done!') })
.catch(console.log)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment