[object Object]

← back to Designer Wallcoverings

romo roll pricing: RFC-4180 CSV parser (quoted fields w/ commas) so 'One, Two, Three' pattern prices correctly

8eb7334485e65e14d2d8a8a222f2121183bac067 · 2026-06-11 11:22:41 -0700 · Steve Abrams

Files touched

Diff

commit 8eb7334485e65e14d2d8a8a222f2121183bac067
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu Jun 11 11:22:41 2026 -0700

    romo roll pricing: RFC-4180 CSV parser (quoted fields w/ commas) so 'One, Two, Three' pattern prices correctly
---
 shopify/scripts/romo-add-roll-pricing.js | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/shopify/scripts/romo-add-roll-pricing.js b/shopify/scripts/romo-add-roll-pricing.js
index 6253b88d..75fc90ce 100644
--- a/shopify/scripts/romo-add-roll-pricing.js
+++ b/shopify/scripts/romo-add-roll-pricing.js
@@ -68,10 +68,25 @@ const M_REORDER = `mutation($pid:ID!,$positions:[ProductVariantPositionInput!]!)
 const M_MF = `mutation($mf:[MetafieldsSetInput!]!){metafieldsSet(metafields:$mf){userErrors{field message}}}`;
 const M_TAGS = `mutation($id:ID!,$tags:[String!]!){tagsAdd(id:$id,tags:$tags){userErrors{field message}}}`;
 
+// RFC-4180-aware split: handles "quoted, fields" containing commas + "" escapes.
+function splitCsvLine(line) {
+  const out = []; let cur = ''; let inQ = false;
+  for (let i = 0; i < line.length; i++) {
+    const ch = line[i];
+    if (inQ) {
+      if (ch === '"') { if (line[i + 1] === '"') { cur += '"'; i++; } else inQ = false; }
+      else cur += ch;
+    } else if (ch === '"') inQ = true;
+    else if (ch === ',') { out.push(cur); cur = ''; }
+    else cur += ch;
+  }
+  out.push(cur);
+  return out;
+}
 function parseCsv(p) {
   const [head, ...lines] = fs.readFileSync(p, 'utf8').trim().split('\n');
-  const cols = head.split(',');
-  return lines.map(l => { const v = l.split(','); const o = {}; cols.forEach((c, i) => o[c] = v[i]); return o; });
+  const cols = splitCsvLine(head);
+  return lines.map(l => { const v = splitCsvLine(l); const o = {}; cols.forEach((c, i) => o[c] = v[i]); return o; });
 }
 
 (async () => {

← 0ed8df7d Repurpose dw-pricing-resume loop → Schumacher API cadence (b  ·  back to Designer Wallcoverings  ·  Store-wide sweep: set every active variant inventory=2026 + 3f4ec431 →