diff --git a/csvToJsonReader/app.js b/csvToJsonReader/app.js new file mode 100644 index 0000000..518c3aa --- /dev/null +++ b/csvToJsonReader/app.js @@ -0,0 +1,9 @@ +'use strict'; + +var csvJson = require('./csvToJson'); +console.log('starting'); +var data = csvJson().readFile('testfile.csv') +console.log(data) + +console.log('Asynchronous conversion using streams') +csvJson().readFileAsync('testfile.csv') \ No newline at end of file diff --git a/csvToJsonReader/csvToJson.js b/csvToJsonReader/csvToJson.js new file mode 100644 index 0000000..c509b53 --- /dev/null +++ b/csvToJsonReader/csvToJson.js @@ -0,0 +1,77 @@ +(function () { + var fs = require('fs') + var csvReader = require('fast-csv') + + module.exports = function(){ + + var methods = {}; + + methods.readFileAsync = function(filename) { + var stream = fs.createReadStream(filename); + + var lineNumber = 0; + var headers = {}; + var csvString = ''; + csvReader.fromStream(stream) + .transform(function(data) { + if(lineNumber === 0) { + headers = data.map(function(d) { + return d.trim(); + }); + lineNumber++; + return; + } + + lineNumber++; + + var line = data.map(function(d) { + return d.trim(); + }) + csvString = csvString + ' ' + methods.csvJsonLine(line, headers); + console.log(csvString); + }) + .on('data', function(data) { + //console.log(data); + }) + .on('end', function() { + console.log('done'); + }); + }; + + methods.csvJsonLine = function(csvLine, headers) { + var obj = {}; + + for(var j = 0; j < headers.length; j++) { + obj[headers[j]] = csvLine[j]; + } + + return JSON.stringify(obj); + }; + + methods.readFile = function(filename) { + var buffer = fs.readFileSync(filename); + + var lines = buffer.toString().split('\n'); + + var headers = lines[0].split(',').map(function(d) { + return d.replace(/[\r]/g, '').trim(); + }); + + var numberOfLines = lines.length; + var objArray = []; + + for(var j = 1; j < numberOfLines; j++) { + var line = lines[j].split(',').map(function(d) { + return d.replace(/[\r]/g, '').trim(); + }); + var jsonObj = methods.csvJsonLine(line, headers); + objArray.push(jsonObj); + } + + return objArray; + } + + return methods; + }; + +}()); diff --git a/csvToJsonReader/testfile.csv b/csvToJsonReader/testfile.csv new file mode 100644 index 0000000..0e4847f --- /dev/null +++ b/csvToJsonReader/testfile.csv @@ -0,0 +1,3 @@ +header1, header2, header3 +one, two, three +four, five, six \ No newline at end of file diff --git a/csvToJsonReader/tests/testcsvJsonLine.js b/csvToJsonReader/tests/testcsvJsonLine.js new file mode 100644 index 0000000..c03d2f7 --- /dev/null +++ b/csvToJsonReader/tests/testcsvJsonLine.js @@ -0,0 +1,13 @@ +var test = require('tape') +var csvJson = require('../csvToJson') + +test('oneLineFile', function (t) { + var headers = ['header1', 'header2'] + var line = ['one', 'two'] + + var result = csvJson().csvJsonLine(line, headers) + + t.equal(result, '{"header1":"one","header2":"two"}') + + t.end() +}) diff --git a/csvToJsonReader/tests/testreadFile.js b/csvToJsonReader/tests/testreadFile.js new file mode 100644 index 0000000..5ad18af --- /dev/null +++ b/csvToJsonReader/tests/testreadFile.js @@ -0,0 +1,9 @@ +var test = require('tape'); +var csvJson = require('../csvToJson'); + +test('simpleFile', function(t) { + var expectedResult = ['{"header1":"one","header2":"two","header3":"three"}','{"header1":"four","header2":"five","header3":"six"}']; + var result = csvJson().readFile('./csvToJsonReader/testfile.csv'); + t.deepEqual(result, expectedResult); + t.end(); +}); \ No newline at end of file diff --git a/package.json b/package.json index 8930853..d0208c2 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Tabular Data support for Dat/hypercore", "main": "index.js", "scripts": { - "test": "standard && tape test/*.js" + "test": "tape csvToJsonReader/tests/*.js" }, "repository": { "type": "git", @@ -25,6 +25,7 @@ }, "devDependencies": { "standard": "^6.0.5", - "tape": "^4.4.0" + "tape": "^4.5.0", + "fast-csv": "^1.0.0" } }