Skip to content

Commit c1cbe16

Browse files
authored
Rename duplicate headers (#956)
1 parent bde83f5 commit c1cbe16

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

papaparse.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,6 +1457,37 @@ License: MIT
14571457
if (!input)
14581458
return returnable();
14591459

1460+
// Rename headers if there are duplicates
1461+
if (config.header)
1462+
{
1463+
var firstLine = input.split(newline)[0];
1464+
var headers = firstLine.split(delim);
1465+
var separator = '_';
1466+
var headerMap = [];
1467+
var headerCount = {};
1468+
var duplicateHeaders = false;
1469+
1470+
for (var j in headers) {
1471+
var header = headers[j];
1472+
if (isFunction(config.transformHeader))
1473+
header = config.transformHeader(header, j);
1474+
var headerName = header;
1475+
1476+
var count = headerCount[header] || 0;
1477+
if (count > 0) {
1478+
duplicateHeaders = true;
1479+
headerName = header + separator + count;
1480+
}
1481+
headerCount[header] = count + 1;
1482+
1483+
headerMap.push(headerName);
1484+
}
1485+
if (duplicateHeaders) {
1486+
var editedInput = input.split(newline);
1487+
editedInput[0] = headerMap.join(delim);
1488+
input = editedInput.join(newline);
1489+
}
1490+
}
14601491
if (fastMode || (fastMode !== false && input.indexOf(quoteChar) === -1))
14611492
{
14621493
var rows = input.split(newline);

tests/test-cases.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,25 @@ var CORE_PARSER_TESTS = [
585585
data: [['a', 'b', 'c'], ['']],
586586
errors: []
587587
}
588-
}
588+
},
589+
{
590+
description: "Simple duplicate header names",
591+
input: 'A,A,A,A\n1,2,3,4',
592+
config: { header: true },
593+
expected: {
594+
data: [['A', 'A_1', 'A_2', 'A_3'], ['1', '2', '3', '4']],
595+
errors: []
596+
}
597+
},
598+
{
599+
description: "Duplicate header names with headerTransform",
600+
input: 'A,A,A,A\n1,2,3,4',
601+
config: { header: true, transformHeader: function(header) { return header.toLowerCase(); } },
602+
expected: {
603+
data: [['a', 'a_1', 'a_2', 'a_3'], ['1', '2', '3', '4']],
604+
errors: []
605+
}
606+
},
589607
];
590608

591609
describe('Core Parser Tests', function() {

0 commit comments

Comments
 (0)