Skip to content

Outlook group to CSV

Javascript
1 mo. ago

Parses a semicolon-separated string of contact entries from an expanded Outlook distribution list into a CSV format.

csv
email
parser
outlook-group-to-csv.js
import fs from "fs";
const input = `Abercrombie, Clarence L. <[email protected]>; Abushawish, Maysaa Z <[email protected]>; Adams, Benjamin <[email protected]>; Anderson, A.K. <[email protected]>; Bond, Sr., Jamie <[email protected]>; Castilla Candil, Luis <[email protected]>; Castillo-Bernal, Melba <[email protected]>; Chang, Shun-Yao <[email protected]>; Chou, Yi Jou <[email protected]>; Crouse, Sr, Jake W. <[email protected]>; Richards, Jr., Robert C <[email protected]>`;
function parseOutlookGroupToCsv() {
const lines = input
.split(";")
.map((entry) => entry.trim())
.filter(Boolean)
.map((entry) => entry.replace(/\b(Jr\.?|Sr\.?|II|III|IV|V),?/gi, "").trim())
.map((entry) => {
const match = entry.match(/^(.*?),\s*(.*?)\s*<([^>]+)>$/);
if (!match) return null;
let [_, lastName, firstPart, email] = match;
if (/test/i.test(email)) return null;
let nameParts = firstPart.split(/\s+/);
if (nameParts.every((p) => /^[A-Z](\.?)$/.test(p))) {
return `${lastName},${nameParts.join(" ")},${email}`;
}
nameParts = nameParts.filter((p) => !/^[A-Z]\.?$/.test(p));
const firstName = nameParts.join(" ");
return `${lastName},${firstName},${email}`;
})
.filter(Boolean);
return ["lastName,firstName,email", ...lines].join("\n");
}
const csv = parseOutlookGroupToCsv();
fs.writeFileSync("output.csv", csv);