I was looking into CSV methods on StackOverflow which didn't have great answers. So I put together some solutions that I'd appreciate.
Here's an answer I made for "JavaScript array to CSV," which didn't have any solid answers.
I found a great solution for parsing CSV so I figured that my work is complete by including a great parseCSV
solution I found a while ago by Trevor Dixon.
// Inspired by: https://stackoverflow.com/a/64618766/1675237 & https://stackoverflow.com/a/58034688/1675237
const arrToCsv = arr => arr.map(row => row.map(s => (
String(s).match(/,|"/) ? `"${s.replace(/"/g,'""')}"` : s
)).join`,`).join`\n`;
const arrObjToCsv = objArr => {
if (!Array.isArray(objArr) || objArr.length === 0) return "";
const headers = Object.keys(objArr[0]);
return arrToCsv([
headers,
...objArr.map(obj => headers.map(key => obj[key]))
]);
};
// Source: https://stackoverflow.com/a/14991797/1675237
const parseCSV = s => {
arr = [];
q = 0;
for (let row = 0, col = 0, c = 0; c < s.length; c++) {
let cc = s[c], nc = s[c+1];
arr[row] = arr[row] || [];
arr[row][col] = arr[row][col] || '';
if (cc == '"' && q&& nc == '"') { arr[row][col] += cc; ++c; continue; }
if (cc == '"') { q= !q; continue; }
if (cc == ',' && !q) { ++col; continue; }
if (cc == '\r' && nc == '\n' && !q) { ++row; col = 0; ++c; continue; }
if (cc == '\n' && !q) { ++row; col = 0; continue; }
if (cc == '\r' && !q) { ++row; col = 0; continue; }
arr[row][col] += cc;
}
return arr;
};
console.log(arrToCsv([
["name1", 2, 3],
["name2", 4, 5],
["name3", 6, 7],
["name4", 8, 9],
["name5", 10, 11]
]));
console.log(arrObjToCsv([
{ name: "name1", age: 22, count: 3 },
{ name: "name2", age: 23, count: 4 },
{ name: "name3", age: 24, count: 5 },
{ name: "name4", age: 25, count: 6 },
{ name: "name5", age: 26, count: 7 }
]));