\nwhere I am getting this output csv as an result.
\nbut I expect this as an output:
\n\n","author":{"@type":"Person","name":"Zeus Carl"},"upvoteCount":0,"answerCount":3,"acceptedAnswer":null}}Reputation: 149
I am facing an issue with ,
separator for csv generation, its working fine. But when there's ,
in the data then its messing up entire csv structure. Example when I have data of Jul 16, 2020 06:16 EDT
then its messing up completely.
This is the data
const data = [
{
NAME: "Peter George",
EMAIL: "peter.george@example.com",
"CARD NUMBER/PIN": "28860",
VALIDITY: "Jul 14, 2020 EDT - Never",
"CARD STATUS": "Active",
"LAST USED ON": "",
"LAST USED ON (ISO)": "",
"CARD TYPE": "CARD",
"FORMAT NAME": "FC 61 - 26 bits format",
},
{
NAME: "Harold Duncan",
EMAIL: "harold.duncan@example.com",
"CARD NUMBER/PIN": "1111",
VALIDITY: "Jul 14, 2020 EDT - Never",
"CARD STATUS": "Active",
"LAST USED ON": "Jul 16, 2020 09:38 EDT",
"LAST USED ON (ISO)": "2020-07-16T09:38:02-04:00",
"CARD TYPE": "CARD",
"FORMAT NAME": "FC 61 - 26 bits format",
},
{
NAME: "Samantha Willis",
EMAIL: "samantha.willis@example.com",
"CARD NUMBER/PIN": "22241",
VALIDITY: "Jul 14, 2020 EDT - Never",
"CARD STATUS": "Active",
"LAST USED ON": "Jul 16, 2020 06:16 EDT",
"LAST USED ON (ISO)": "2020-07-16T06:16:00-04:00",
"CARD TYPE": "CARD",
"FORMAT NAME": "FC 61 - 26 bits format",
},
];
And this is the function I am using to convert this into csv
function ArrayOfObjectsToCSV(
data,
columnDelimiter = ",",
lineDelimiter = "\n"
) {
let result;
let ctr;
if (data == null || !data.length) {
return null;
}
const keys = Object.keys(data[0]);
result = keys.join(columnDelimiter) + lineDelimiter;
data.forEach((item) => {
ctr = 0;
keys.forEach((key) => {
if (ctr > 0) result += columnDelimiter;
result += item[key];
ctr += 1;
});
result += lineDelimiter;
});
return result;
}
where I am getting this output csv as an result.
but I expect this as an output:
Upvotes: 0
Views: 37
Reputation: 4998
Please try the following solution
const data = [
{
NAME: "Peter George",
EMAIL: "peter.george@example.com",
"CARD NUMBER/PIN": "28860",
VALIDITY: "Jul 14, 2020 EDT - Never",
"CARD STATUS": "Active",
"LAST USED ON": "",
"LAST USED ON (ISO)": "",
"CARD TYPE": "CARD",
"FORMAT NAME": "FC 61 - 26 bits format",
},
{
NAME: "Harold Duncan",
EMAIL: "harold.duncan@example.com",
"CARD NUMBER/PIN": "1111",
VALIDITY: "Jul 14, 2020 EDT - Never",
"CARD STATUS": "Active",
"LAST USED ON": "Jul 16, 2020 09:38 EDT",
"LAST USED ON (ISO)": "2020-07-16T09:38:02-04:00",
"CARD TYPE": "CARD",
"FORMAT NAME": "FC 61 - 26 bits format",
},
{
NAME: "Samantha Willis",
EMAIL: "samantha.willis@example.com",
"CARD NUMBER/PIN": "22241",
VALIDITY: "Jul 14, 2020 EDT - Never",
"CARD STATUS": "Active",
"LAST USED ON": "Jul 16, 2020 06:16 EDT",
"LAST USED ON (ISO)": "2020-07-16T06:16:00-04:00",
"CARD TYPE": "CARD",
"FORMAT NAME": "FC 61 - 26 bits format",
},
];
function arrayOfObjectsToCSV(data, delimiter = ",", lineDelimiter = "\n") {
const columnNames = Object.keys(data[0]).join(delimiter);
const values = data.map((entry) => Object.values(entry).join(delimiter));
return columnNames + "\n" + values;
}
console.log(arrayOfObjectsToCSV(data));
Upvotes: 0
Reputation: 643
https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules
Per CSV rules, Fields with embedded commas or double-quote characters must be quoted.
e.g.
1997, Ford, E350, "Super, ""luxurious"" truck"
Upvotes: 1
Reputation: 117
There's not really a way to bypass this, but you might be able to add a backslash before the comma so that it's just used as a string.
Upvotes: 0