diff --git a/papaparse.js b/papaparse.js index 60ee489b..aa5ebddf 100755 --- a/papaparse.js +++ b/papaparse.js @@ -1457,6 +1457,37 @@ License: MIT if (!input) return returnable(); + // Rename headers if there are duplicates + if (config.header) + { + var firstLine = input.split(newline)[0]; + var headers = firstLine.split(delim); + var separator = '_'; + var headerMap = []; + var headerCount = {}; + var duplicateHeaders = false; + + for (var j in headers) { + var header = headers[j]; + if (isFunction(config.transformHeader)) + header = config.transformHeader(header, j); + var headerName = header; + + var count = headerCount[header] || 0; + if (count > 0) { + duplicateHeaders = true; + headerName = header + separator + count; + } + headerCount[header] = count + 1; + + headerMap.push(headerName); + } + if (duplicateHeaders) { + var editedInput = input.split(newline); + editedInput[0] = headerMap.join(delim); + input = editedInput.join(newline); + } + } if (fastMode || (fastMode !== false && input.indexOf(quoteChar) === -1)) { var rows = input.split(newline); diff --git a/tests/test-cases.js b/tests/test-cases.js index 75a20db4..843ba33c 100644 --- a/tests/test-cases.js +++ b/tests/test-cases.js @@ -585,7 +585,25 @@ var CORE_PARSER_TESTS = [ data: [['a', 'b', 'c'], ['']], errors: [] } - } + }, + { + description: "Simple duplicate header names", + input: 'A,A,A,A\n1,2,3,4', + config: { header: true }, + expected: { + data: [['A', 'A_1', 'A_2', 'A_3'], ['1', '2', '3', '4']], + errors: [] + } + }, + { + description: "Duplicate header names with headerTransform", + input: 'A,A,A,A\n1,2,3,4', + config: { header: true, transformHeader: function(header) { return header.toLowerCase(); } }, + expected: { + data: [['a', 'a_1', 'a_2', 'a_3'], ['1', '2', '3', '4']], + errors: [] + } + }, ]; describe('Core Parser Tests', function() {