2017-10-09 1 views
1

SuitesSript 2.0을 호출하는 서버 측 JavaScript를 실행하는 CRM 시스템 인 NetSuite에서 Google 쇼핑 피드 30,000 개 이상을 생성하려고합니다. 본질적으로, 단지 몇 가지 제한이있는 JavaScript 일뿐입니다. 나는이 제품 피드를 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]) + '\"'; 

을, 항목의 많은 수에서 새로운 라인과 I 최대 푸시되지 않습니다 난 계속 허용되기 때문에 허용됩니다.

다른 자연 솔루션은 제품 설명을 편집 이동하는 것입니다,하지만 난 ... 30,000 항목에 대해 그렇게하는 것이 정말 불안하지 않다

사람이 여기에 갈 수있는 무엇을 알고 있나요? 정말 단순한 무언가가 있다는 것을 느낄 수 있습니다.

+0

당신의 탈출 기능이 출력에 백 슬래시를 추가하기로되어있는 경우는 문자열에서 백 슬래시를 이스케이프해야합니다 '\\ '' '또는''\\' "'의 작은 따옴표를 포함하는 함수의 경우에는 '\\,'대신에 '\,' – nnnnnn

+0

아니요, 백 슬래시를 추가하지 않아도됩니다. 최종 문자열을 얻기 위해 이스케이프 처리 만하기로되어있었습니다. 이스케이프 된 백 슬래시를 추가하면 사물이 다시 엉망이되어 새로운 줄이 추가되지 않고 따옴표가있는 줄 끝에 추가됩니다. – B1gJ4k3

+0

"최종 문자열에 대해 이스케이프 처리"가 의미하는 것은 무엇입니까? 최종 문자열에 백 슬래시가 추가됩니다. 예를 들어, 특정 * 필드 *에 대한 입력이 'Hello, good bye'이면 출력은 'Hello \, good bye'이어야합니다.CSV의 경우 줄 바꿈을 제거하고 각 입력란을 큰 따옴표로 묶는 경우 이중 따옴표 만 이스케이프해야한다고 생각할 수 있습니다. 어떤 이유에서 전체 * 행 *을 큰 따옴표로 묶는 것처럼 보일지라도, 이는 CSV에서는 정상이 아닙니다. 샘플을 두 줄 입력하고 해당 출력을 표시하려면 질문을 편집하십시오. – nnnnnn

답변

1

CSV specs에 따르면 이미 인용 된 문자열에 큰 따옴표를 포함하는 것으로 나타났습니다. 큰 따옴표 ("")를 사용해야합니다.). 나는 변경 :

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

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

에 CSV의 열이 이미 인용되고 있기 때문에 나는 또한
itemDesc = itemDesc.replace(/,/g, '\,'); 
itemDesc = itemDesc.replace(/'/g, '\''); 

를 제거했습니다. 이것들은 불필요합니다.

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'); 
} 
관련 문제