/* This script parses the big gun violence CSV and filters for lines containing a particular string. 479363, 2013-01-19,New Mexico,Albuquerque,2806 Long Lane, 5,0, http://www.gunviolencearchive.org/incident/479363, http://hinterlandgazette.com/2013/01/pastor-greg-griego-identified-victims-killed-nehemiah-griego-albuquerque-nm-shooting.html, False,1, gun_stolen, 0::Unknown||1::Unknown, gun_type, 0::22 LR||1::223 Rem [AR-15], incident_characteristics, "Shot - Dead (murder, accidental, suicide) ||Mass Shooting (4+ victims injured or killed excluding the subject/suspect/perpetrator, one location) ||Domestic Violence", latitude, location_description, longitude, 34.9791,,-106.716, n_guns_involved, notes, 2,, participant_age, 0::51||1::40||2::9||3::5||4::2||5::15, participant_age_group, 0::Adult 18+||1::Adult 18+||2::Child 0-11||3::Child 0-11||4::Child 0-11||5::Teen 12-17, participant_gender, 0::Male||1::Female||2::Male||3::Female||4::Female||5::Male, participant_name, 0::Greg Griego||1::Sara Griego||2::Zephania Griego||3::Jael Griego||4::Angelina Griego||5::Nehemiah Griego, participant_relationship, 5::Family, participant_status, "0::Killed||1::Killed||2::Killed||3::Killed||4::Killed||5::Unharmed, Arrested", participant_type, 0::Victim||1::Victim||2::Victim||3::Victim||4::Victim||5::Subject-Suspect, http://www.cbsnews.com/news/nehemiah-gringo-case-memorial-service-planned-for-family-allegedly-slain-by-new-mexico-teen/|| http://www.thewire.com/national/2013/01/teenager-reportedly-used-ar-15-kill-five-new-mexico/61199/|| http://bigstory.ap.org/article/officials-nm-teen-gunman-kills-5-inside-home|| http://www.huffingtonpost.com/2013/01/21/nehemiah-griego-teen-shoots-parents-3-children_n_2519359.html|| http://murderpedia.org/male.G/g/griego-nehemiah.htm|| http://hinterlandgazette.com/2013/01/pastor-greg-griego-identified-victims-killed-nehemiah-griego-albuquerque-nm-shooting.html, 10,14 */ const fs = require('fs') const parse = require('csv-parse') const stringify = require('csv-stringify') const fields = ("incident_id,date,state,city_or_county," + "address,n_killed,n_injured,incident_url,source_url," + "incident_url_fields_missing,congressional_district," + "gun_stolen,gun_type,incident_characteristics,latitude," + "location_description,longitude,n_guns_involved,notes," + "participant_age,participant_age_group,participant_gender," + "participant_name,participant_relationship," + "participant_status,participant_type," + "sources,state_house_district,state_senate_district") .split(',') .reduce((a,b,i) => { a[b] = i return a }, {}) const search = 'school-shootings' // const regexp = new RegExp(search, 'i') function test(row){ return ( row // && row[fields.incident_characteristics].indexOf('Non-Shooting Incident') === -1 && row[fields.incident_characteristics].indexOf('School Shooting') !== -1 // // && row[fields.participant_age_group].indexOf('Teen') !== -1 // && row[fields.participant_age_group].indexOf('Child') !== -1 // && row[fields.gun_type].indexOf('AR-15') !== -1 ) } const input = fs.createReadStream('./data/rest/gun_violence.csv') const parser = parse() const stringifier = stringify() const output = fs.createWriteStream('./data/' + search + '.csv') input.on('readable', function() { let buf while ((buf = input.read()) !== null) { parser.write(buf) } }) input.on('error', function(err){ console.error('input error', err.message) }) input.on('finish', function(){ parser.end() }) let i = 0 parser.on('readable', function(){ let row while (row = parser.read()) { if (i === 0) { stringifier.write(row) } if ((++i % 10000) === 0) { console.log(i + '...') } if (test(row)) { stringifier.write(row) } } }) parser.on('error', function(err){ console.error('parser error', err.message) }) parser.on('end', function(){ stringifier.end() }) stringifier.on('readable', function(){ let row while(row = stringifier.read()){ output.write(row) } }) stringifier.on('error', function(err){ console.error('stringifier error', err.message) }) stringifier.on('finish', function(){ output.end() })