我试图在NetSuite中生成一个包含30,000多个项目的Google Shopping提要,NetSuite是一个CRM系统,运行服务器端的JavaScript,它称之为Suitescript2.0。本质上,它只是JavaScript,但有一些限制。我的任务是将此产品提要输出为CSV。
问题是,这些项目的产品描述包含变量数量的逗号,双引号,单引号和HTML。起初,这只是逗号给我带来的问题,所以经过一番研究,我把我输出的字符串 Package 在双引号中:
//This function isn't terribly important, but is referenced below
function sanitizeString (desc) {
var itemDesc;
if (desc) {
itemDesc = desc.replace(/(\r\n|\n|\r|\s+|\t| )/gm,' ');
itemDesc = itemDesc.replace(/,/g, '\,');
itemDesc = itemDesc.replace(/"/g, '\"');
itemDesc = itemDesc.replace(/'/g, '\'');
itemDesc = itemDesc.replace(/ +(?= )/g,'');
} else {
itemDesc = '';
}
return itemDesc;
}
var row = '';
for (var i = 0; i < columns.length; i++) {
var col = columns[i];
row += '"' + sanitizeString(val[col]) + '"';
if (i != columns.length - 1) {
row += ',';
}
}
newFeed.appendLine({value: row});
字符串
然而,看起来这些双引号与字符串中的双引号奇怪地相互作用,导致一些奇怪的格式,即使我的sanitizeString()函数应该转义它们。任何时候,描述包含双引号,下一行都不会得到它自己的行。它会被追加到最后一列。
所以,很自然地,我像这样转义了外部引号:
row += '\"' + sanitizeString(val[col]) + '\"';
型
这样做会使事情变得完全混乱,很多项目不会被推到新的行,我最大限度地限制了我所允许的列数,因为它只是继续下去。
另一个自然的解决方案是去编辑产品说明,但我并不急于为30,000多个项目做这件事。
有人知道这是怎么回事吗?我觉得有些很简单的东西我忽略了...
3条答案
按热度按时间b4lqfgs41#
事实证明,根据CSV规范,要在已经被引用的字符串中包含双引号,您需要使用两个双引号(“”)。我修改了:
字符串
到
型
我还删除了
型
因为CSV中的列已经被引用。这些是不必要的。
6ovsh4lw2#
我使用这个简单的函数将
string[][]
转换为csv文件。如果单元格中包含"
,,
或其他空格(空格除外),则将其引用:字符串
tpgth1q73#
在我的例子中,我不想引用不需要引用的字符串,所以在引用之前,我先测试字符串中是否有讨厌的字符。
字符串