Skip to content

Commit 26e53df

Browse files
fortydegreesidanhaviv
authored andcommitted
Rename duplicate headers (mholt#956)
1 parent e11ee26 commit 26e53df

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
@@ -1456,6 +1456,37 @@ License: MIT
14561456
if (!input)
14571457
return returnable();
14581458

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