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({
<code>transformHeader</code> <code>transformHeader</code>
</td> </td>
<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. 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> </td>
</tr> </tr>
<tr> <tr>

20
papaparse.js

@ -1184,24 +1184,26 @@ License: MIT
if (!_results) if (!_results)
return; return;
function addHeader(header, i) var headerLines = _config.headerLines || 1;
function addHeader(j, header, i, arr)
{ {
if (isFunction(_config.transformHeader)) 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])) if (Array.isArray(_results.data[0]))
{ {
for (var i = 0; needsHeaderRow() && i < _results.data.length; i++) for (var j = 0; j < Math.min(headerLines, _results.data.length); j++)
_results.data[i].forEach(addHeader); {
// 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.splice(0, 1); _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. // if _results.data[0] is not an array, we are in a step where _results.data is the row.
else else
_results.data.forEach(addHeader); _results.data.forEach(addHeader.bind(null, 0));
} }
function shouldApplyDynamicTyping(field) { function shouldApplyDynamicTyping(field) {

9
tests/test-cases.js

@ -767,6 +767,15 @@ var PARSE_TESTS = [
errors: [] 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", description: "transformHeader accepts and optional index attribute",
input: 'A,B,C\r\na,b,c', input: 'A,B,C\r\na,b,c',

Loading…
Cancel
Save