Browse Source

Merge ac6f19168c into e11ee26581

pull/898/merge
LAZY 3 years ago committed by GitHub
parent
commit
660b079d73
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      docs/docs.html
  2. 20
      papaparse.js
  3. 9
      tests/test-cases.js

19
docs/docs.html

@ -510,8 +510,25 @@ var csv = Papa.unparse({ @@ -510,8 +510,25 @@ var csv = Papa.unparse({
<code>transformHeader</code>
</td>
<td>
A function to apply on each header. Requires <code>header</code> to be <code>true</code>. The function receives the header as its first argument and the index as second.<br>
A function to apply on each header. Requires <code>header</code> to be <code>true</code>. The arguments are:
<ul>
<li><b>header:</b> the current header text, as parsed from the appropriate cell in the specified header row</li>
<li><b>index:</b> the column number of the header text (0 for first column)</li>
<li><b>arr:</b> the string array of data for that row</li>
<li><b>acc:</b> the existing header for that column based on previous lines iteration ('' if no previous lines)</li>
<li><b>j:</b> the rowNumber (0 for the first line)</li>
</ul>
Only available starting with version 5.0.
The latter three parameters (arr, acc, j) are only available when used in conjunction with config.headerLines and from version 5.4+.
</td>
</tr>
<tr>
<td>
<code>headerLines</code>
</td>
<td>
The number of rows which will be used to transform into a header, and removed from the rest of the data. Requires header to be true. Default 1.
Only available starting with veresion 5.4.
</td>
</tr>
<tr>

20
papaparse.js

@ -1184,24 +1184,26 @@ License: MIT @@ -1184,24 +1184,26 @@ License: MIT
if (!_results)
return;
function addHeader(header, i)
var headerLines = _config.headerLines || 1;
function addHeader(j, header, i, arr)
{
if (isFunction(_config.transformHeader))
header = _config.transformHeader(header, i);
header = _config.transformHeader(header, i, arr, _fields[i] || '', j);
_fields.push(header);
_fields[i] = header;
}
if (Array.isArray(_results.data[0]))
{
for (var i = 0; needsHeaderRow() && i < _results.data.length; i++)
_results.data[i].forEach(addHeader);
_results.data.splice(0, 1);
for (var j = 0; j < Math.min(headerLines, _results.data.length); j++)
{
// A function which takes two arguments (header, i) where j is set by the fact it is called in this loop. It then calls addHeader() with all three arguments
_results.data[j].forEach(addHeader.bind(null, j));
}
_results.data.splice(0, headerLines);
}
// if _results.data[0] is not an array, we are in a step where _results.data is the row.
else
_results.data.forEach(addHeader);
_results.data.forEach(addHeader.bind(null, 0));
}
function shouldApplyDynamicTyping(field) {

9
tests/test-cases.js

@ -767,6 +767,15 @@ var PARSE_TESTS = [ @@ -767,6 +767,15 @@ var PARSE_TESTS = [
errors: []
}
},
{
description: "Header row is generated from multiple rows when transformheader function is provided and config.headerLines is set",
input: "A,B,C\r\nD,E,F\r\nG,H,I\r\nadg,beh,cfi",
config: { header: true, transformHeader: function(header, i, arr, acc, j) { return acc + (j % 2 ? header.toLowerCase() : header); }, headerLines: 3 },
expected: {
data: [{"AdG": "adg", "BeH": "beh", "CfI": "cfi"}],
errors: []
}
},
{
description: "transformHeader accepts and optional index attribute",
input: 'A,B,C\r\na,b,c',

Loading…
Cancel
Save