benwinding / react-admin-import-csv

A csv file import button for react-admin

Home Page:https://benwinding.github.io/react-admin-import-csv

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

array of one element

shrue348 opened this issue · comments

I transform some data width transform func in parse config to array of numbers (for example [123,123,123,123])
If array has 2 and more elements, it transmitted to dataProvider normally
But if array has one element (for example [123]), in transmitted to dataProvider as single number 123

Hi @shrue348,
Thanks for checking out the library, but I'm having a little trouble understanding the problem. Are you saying that you're storing an array in a CSV field?

Please try the following to help me understand your issue:

  • Give me a basic CSV file which demonstrates the problem
  • Give me the transform code, which demonstrates the problem

Cheers,
Ben

ok
here is my config

const regExp = /[([^)]+)]/;
export const importCSVConfig = {
parseConfig: {
dynamicTyping: true,
transform: (val: any) => {
if (val.match(regExp)) {
return (val.match(regExp)[1] || '')
.split(',')
.map((el: any) => (
Number(el) ? Number(el) : el
));
}
return val;
},
},
preCommitCallback: (action: 'create' | 'overwrite', values: any) => values.map((item: {[key: string]: any}) => {
const newItem = {} as {[key: string]: any};
Object.keys(item).forEach((key: string) => {
if (
item[key] !== null
&& item[key] !== 'undefined'
) newItem[key] = item[key];
});
return newItem;
}),
};

in transform function i check field on array, cut string from [], split it for real array, and try convert array items to numbers
in preCommitCallback I push real fields (not null and undefined in payload object to dataProvider)
if array from transform func has 2 or more elements this field come in values of preCommitCallback as array
BUT! if array has one element (for exaple [123]), it come in values as simple number or string

csv
id, somefield 10, [1,2,3,4,5]
payload
{id: 10, somefield: [1,2,3,4,5]}

csv
id, somefield 10, [12345]
payload
{id: 10, somefield: 12345 /* not[12345] */}

PS i dont find in documentation, how to import to mysql json fields arrays or objects (i need arrays)
i think problem in dynamicTyping: true
today i try to find it

i resolve this problem
i turn off dynamicTyping and add simple typing in transform function

parseConfig: {
dynamicTyping: false,
transform: (val: any) => {
if (val.match(regExp)) {
return (val.match(regExp)[1] || '')
.split(',')
.map((el: any) => (
Number(el) ? Number(el) : el
));
}
if (val === 'false') return false;
if (val === 'true') return true;
if (val === '[]') return [];
if (val === '0') return 0;
if (Number(val)) return Number(val);
return val;
},
},

Great work @shrue348, glad to hear you got it sorted out!