2017-10-09 235 views
1

我正试图在NetSuite中生成一个包含30,000多个项目的Google购物Feed,该系统运行称为Suitescript 2.0的服务器端JavaScript。从本质上讲,它只是带有更多限制的JavaScript。我一直负责将此产品Feed作为CSV输出。将包含逗号和双引号的字符串写入CSV

问题是这些项目的产品说明包含变量数量的逗号,双引号,单引号和HTML。起初,它只是使我的问题的逗号,所以一些研究之后,我包我在双引号输出字符串:

//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项...

有谁知道可能会在这里吗?我觉得有一些很简单的东西可以忽略...

+0

如果你避开功能应该反斜杠添加到输出,你需要逃避反斜杠在字符串中函数中的文字,即“\\,”而不是“\ \”,或者是包含单引号的文字,或者是'''''或者''\\'“'。 – nnnnnn

+0

不,它不应该添加反斜杠。这只是为了逃避他们的最后一个字符串。添加溢出的反斜杠会使事情再次失灵,并且不会添加新行,但会将其附加到包含引号的行的末尾...... – B1gJ4k3

+0

什么是“为了最终字符串而逃脱它们”对您意味着什么?这是不是说最终的字符串会添加反斜杠?例如,如果特定*字段*的输入是“你好,再见”,那么输出应该是“你好\,再见”,不是吗?对于CSV,假设你正在删除换行符并将每个字段放在双引号中,我认为只有双引号需要被转义 - 虽然由于某种原因,您似乎将整个*行*放在双引号中,这对CSV来说不正常。请[编辑]您的问题,以显示一个示例两行输入和相应的期望输出。 – nnnnnn

回答

1

事实证明,根据CSV specs,要在已经引用的字符串中包含双引号,您需要使用两个双引号(“” )。我改变:

itemDesc = itemDesc.replace(/"/g, '\"'); 

itemDesc = itemDesc.replace(/"/g, '""'); 

我也删除

itemDesc = itemDesc.replace(/,/g, '\,'); 
itemDesc = itemDesc.replace(/'/g, '\''); 

由于在CSV列被已经引用。这些是不必要的。

0

我使用这个简单的函数将string[][]转换为csv文件。它引用的单元格,如果它包含一个",一个,或其它空格(空格除外):

/** 
* Takes an array of arrays and returns a `,` sparated csv file. 
* @param {string[][]} table 
* @returns {string} 
*/ 
export function toCSV(table: string[][]) { 
    return table 
     .map(row => 
      row 
       .map(cell => { 
        // We remove blanks and check if the column contains 
        // other whitespace,`,` or `"`. 
        // In that case, we need to quote the column. 
        if (cell.replace(/ /g, '').match(/[\s,"]/)) { 
         return '"' + cell.replace(/"/g, '""') + '"'; 
        } 
        return cell; 
       }) 
       .join(',') 
     ) 
     .join('\n'); 
} 
相关问题