Zeus Carl
Zeus Carl

Reputation: 149

creating CSV having issue with , seprator

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;
}

enter image description here where I am getting this output csv as an result.

but I expect this as an output:

enter image description here

Upvotes: 0

Views: 37

Answers (3)

Mario
Mario

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

h0ss
h0ss

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

horrible
horrible

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

Related Questions