Browse Source

Config accepts transform option now, which can be a function to apply of values

pull/505/head
efossas 7 years ago
parent
commit
643e806cee
  1. 21
      papaparse.js
  2. 60
      tests/test-cases.js

21
papaparse.js

@ -203,6 +203,8 @@
} }
_config.dynamicTyping = dynamicTyping; _config.dynamicTyping = dynamicTyping;
_config.transform = isFunction(_config.transform) ? _config.transform : false;
if (_config.worker && Papa.WORKERS_SUPPORTED) if (_config.worker && Papa.WORKERS_SUPPORTED)
{ {
var w = newWorker(); var w = newWorker();
@ -976,7 +978,7 @@
if (needsHeaderRow()) if (needsHeaderRow())
fillHeaderFields(); fillHeaderFields();
return applyHeaderAndDynamicTyping(); return applyHeaderAndDynamicTypingAndTransformation();
} }
function needsHeaderRow() function needsHeaderRow()
@ -1028,9 +1030,21 @@
return value; return value;
} }
function applyHeaderAndDynamicTyping() function parseTransform(field, value) {
if (_config.transform) {
if (_config.transform.length === 1) {
return _config.transform(value);
} else {
return _config.transform(field,value);
}
} else {
return value;
}
}
function applyHeaderAndDynamicTypingAndTransformation()
{ {
if (!_results || (!_config.header && !_config.dynamicTyping)) if (!_results || (!_config.header && !_config.dynamicTyping && !_config.transform))
return _results; return _results;
for (var i = 0; i < _results.data.length; i++) for (var i = 0; i < _results.data.length; i++)
@ -1046,6 +1060,7 @@
if (_config.header) if (_config.header)
field = j >= _fields.length ? '__parsed_extra' : _fields[j]; field = j >= _fields.length ? '__parsed_extra' : _fields[j];
value = parseTransform(field, value);
value = parseDynamic(field, value); value = parseDynamic(field, value);
if (field === '__parsed_extra') if (field === '__parsed_extra')

60
tests/test-cases.js

@ -872,6 +872,66 @@ var PARSE_TESTS = [
errors: [] errors: []
} }
}, },
{
description: "Custom transform function converts all true and false strings to booleans regardless of case",
input: '"true","false","T","F"\r\n"TRUE","FALSE","True","False"',
config: {
transform: function(value) {
if(typeof value === "string" && value.toLowerCase() === "true") return true;
if(typeof value === "string" && value.toLowerCase() === "false") return false;
return value;
}
},
expected: {
data: [[true,false,"T","F"], [true, false, true, false]],
errors: []
}
},
{
description: "Custom transform function converts leading zero strings to number and empty strings to NULL",
input: '001,002,003\r\n,null,undefined',
config: {
transform: function(value) {
if ((/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i).test(value)) {
return Number.parseFloat(value);
} else if (value === "") {
return null;
}
return value;
}
},
expected: {
data: [[1,2,3], [null,"null","undefined"]],
errors: []
}
},
{
description: "Custom transform function uses cache to determine whether to act on column",
input: 'A,B,C\r\n1,2,3\r\n4,5,6',
config: {
transform: function(field,value) {
if (!this.transformCache) {
this.transformCache = {};
} else if (this.transformCache[field] === true) {
return value + ".0";
} else if (this.transformCache[field] === false) {
return value;
}
if (field > 0) {
this.transformCache[field] = true;
return value + ".0";
} else {
this.transformCache[field] = false;
return value;
}
}
},
expected: {
data: [["A","B.0","C.0"], ["1","2.0","3.0"], ["4","5.0","6.0"]],
errors: []
}
},
{ {
description: "Blank line at beginning", description: "Blank line at beginning",
input: '\r\na,b,c\r\nd,e,f', input: '\r\na,b,c\r\nd,e,f',

Loading…
Cancel
Save