diff --git a/csvToJson/CSVToJSON.js b/csvToJson/CSVToJSON.js new file mode 100644 index 0000000..e3350ac --- /dev/null +++ b/csvToJson/CSVToJSON.js @@ -0,0 +1,35 @@ +var fs = require('fs') +var path = require('path') + +function lineToJSON (headings, lines) { + var result = {}; + for (var i = 0; i < headings.length; i++) { + // Remove vestigal double quotes from beginning + // and end of line strings + var line = lines[i].replace(/^"|"$/g, '') + result[headings[i]] = line; + } + return result; +} + +function convert (filepath) { + var fpath = path.join(__dirname, filepath) + var jsonArr = []; + var file = fs.readFileSync(fpath, 'utf8') + + // Replace newlines to enforce the same style for newline + // characters across operating systems. + var lines = file.replace(/(\r\n|\r|\n)/g, '\n') + .split(/\r?\n/g); + var headings = lines.shift(); + lines.forEach(function(line) { + if (line) { + // positive lookahead regex to avoid splitting on commas + // that appear within double-quotes + jsonArr.push(lineToJSON(headings.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/), + line.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/))) + } + }); + return jsonArr +} +module.exports = convert diff --git a/csvToJson/sampleData.csv b/csvToJson/sampleData.csv new file mode 100644 index 0000000..f55b49c --- /dev/null +++ b/csvToJson/sampleData.csv @@ -0,0 +1,5 @@ +Type of Experience,Little/No Experience,Some Experience,Very Familiar +Writing software in any programming language,1,5,4 +Frontend Web Development,4,3,3 +Server-side (“backend”) Web Development,4,4,2 +"Using Git to track changes and share code (add, commit, push, pull)",2,5,3 \ No newline at end of file diff --git a/csvToJson/tests.js b/csvToJson/tests.js new file mode 100644 index 0000000..abbd348 --- /dev/null +++ b/csvToJson/tests.js @@ -0,0 +1,34 @@ +var csvToJson = require('./CSVToJSON'); +var test = require('tape'); + +expected = [ + { + "Type of Experience": "Writing software in any programming language", + "Little/No Experience": 1, + "Some Experience": 5, + "Very Familiar": 4 + }, + { + "Type of Experience": "Frontend Web Development", + "Little/No Experience": 4, + "Some Experience": 3, + "Very Familiar": 3 + }, + { + "Type of Experience": "Server-side (“backend”) Web Development", + "Little/No Experience": 4, + "Some Experience": 4, + "Very Familiar": 2 + }, + { + "Type of Experience": "Using Git to track changes and share code (add, commit, push, pull)", + "Little/No Experience": 2, + "Some Experience": 5, + "Very Familiar": 3 + } +] + +test('csv to json', function(t) { + t.plan(1); + t.equal(csvToJson('sampleData.csv'), expected); +}) \ No newline at end of file