diff --git a/snippets/CSVToJSON.md b/snippets/CSVToJSON.md new file mode 100644 index 000000000..15809c916 --- /dev/null +++ b/snippets/CSVToJSON.md @@ -0,0 +1,24 @@ +### CSVToJSON + +Converts a comma-separated values (CSV) string to a 2D array of objects. +The first row of the string is used as the title row. + +Use `Array.slice()` and `Array.indexOf('\n')` and `String.split(delimiter)` to separate the first row (title row) into values. +Use `String.split('\n')` to create a string for each row, then `Array.map()` and `String.split(delimiter)` to separate the values in each row. +Use `Array.reduce()` to create an object for each row's values, with the keys parsed from the title row. +Omit the second argument, `delimiter`, to use a default delimiter of `,`. + +```js +const CSVToJSON = (data, delimiter = ',') => { + const titles = data.slice(0,data.indexOf('\n')).split(delimiter); + return data.slice(data.indexOf('\n')+1).split('\n').map(v => { + const values = v.split(delimiter); + return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); + }); +} +``` + +```js +CSVToJSON('col1,col2\na,b\nc,d'); // [{'col1': 'a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}]; +CSVToJSON('col1;col2\na;b\nc;d', ';'); // [{'col1': 'a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}]; +``` diff --git a/tag_database b/tag_database index 805fe69e2..7663809dc 100644 --- a/tag_database +++ b/tag_database @@ -40,6 +40,7 @@ countOccurrences:array createElement:browser,utility createEventHub:browser,event,advanced CSVToArray:string,array,utility +CSVToJSON:string,array,object,advanced currentURL:browser,url curry:function,recursion debounce:function diff --git a/test/CSVToArray/CSVToArray.js b/test/CSVToArray/CSVToArray.js index ea7c5eea5..4633b20ca 100644 --- a/test/CSVToArray/CSVToArray.js +++ b/test/CSVToArray/CSVToArray.js @@ -1,3 +1,6 @@ const CSVToArray = (data, delimiter = ',', omitFirstRow = false) => -data.slice(omitFirstRow ? data.indexOf('\n')+1 : 0).split('\n').map(v => v.split(delimiter)); +data +.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0) +.split('\n') +.map(v => v.split(delimiter)); module.exports = CSVToArray; \ No newline at end of file diff --git a/test/CSVToJSON/CSVToJSON.js b/test/CSVToJSON/CSVToJSON.js new file mode 100644 index 000000000..4ed54c1e6 --- /dev/null +++ b/test/CSVToJSON/CSVToJSON.js @@ -0,0 +1,8 @@ +const CSVToJSON = (data, delimiter = ',') => { +const titles = data.slice(0,data.indexOf('\n')).split(delimiter); +return data.slice(data.indexOf('\n')+1).split('\n').map(v => { +const values = v.split(delimiter); +return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); +}); +} +module.exports = CSVToJSON; \ No newline at end of file diff --git a/test/CSVToJSON/CSVToJSON.test.js b/test/CSVToJSON/CSVToJSON.test.js new file mode 100644 index 000000000..be4479764 --- /dev/null +++ b/test/CSVToJSON/CSVToJSON.test.js @@ -0,0 +1,12 @@ +const expect = require('expect'); +const CSVToJSON = require('./CSVToJSON.js'); + +test('CSVToJSON is a Function', () => { + expect(CSVToJSON).toBeInstanceOf(Function); +}); +test('CSVToJSON works with default delimiter', () => { + expect(CSVToJSON('col1,col2\na,b\nc,d')).toEqual([{'col1': 'a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}]); +}); +test('CSVToJSON works with custom delimiter', () => { + expect(CSVToJSON('col1;col2\na;b\nc;d', ';')).toEqual([{'col1': 'a', 'col2': 'b'}, {'col1': 'c', 'col2': 'd'}]); +});