← 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
M shopify/scripts/romo-add-roll-pricing.js
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 →