2017-07-10 95 views
0

我有一個函數可以將數組轉換爲csv文件。它用逗號分隔,但當數組中的某個值有逗號時,它也會在這裏分開。我試圖用引號包住逗號並將其轉義,但仍然會打破csv。關於如何在逗號分隔但不在數組的值內的任何想法?數組到csv忽略逗號的值

convertArrayOfObjectsToCSV: function(args) { 
      var result, ctr, keys, columnDelimiter, lineDelimiter, data; 

      data = args.data || null; 
      if (data == null || !data.length) { 
       return null; 
      } 

      columnDelimiter = args.columnDelimiter || ','; 
      lineDelimiter = args.lineDelimiter || '\n'; 

      keys = Object.keys(data[0]); 

      result = ''; 
      result += keys.join(columnDelimiter); 
      result += lineDelimiter; 

      data.forEach(function(item) { 
       ctr = 0; 
       keys.forEach(function(key) { 
        if (ctr > 0) result += columnDelimiter; 

        result += item[key]; 
        ctr++; 
       }); 
       result += lineDelimiter; 
      }); 

      return result; 
     }, 
     downloadCSV: function(args) { 
      var data, filename, link, csvArray; 

      csvArray = ids.map(function(id) { 
       return { 
        'id': id.id, 
        'image': id.image, 
        'desc': id.desc 
       }; 
      }); 
      var csv = utilities.convertArrayOfObjectsToCSV({ 
       data: csvArray 
      }); 


      if (csv == null) return; 

      filename = args.filename || 'export.csv'; 

      if (!csv.match(/^data:text\/csv/i)) { 
       csv = 'data:text/csv;charset=utf-8,' + csv; 
      } 
      data = encodeURI(csv); 

      link = document.createElement('a'); 
      link.setAttribute('href', data); 
      link.setAttribute('download', filename); 
      link.click(); 
     } 
    }; 

這裏是csvArray創建的數據樣本:你怎麼寫,導致文本

[{id:123, 
image:image, 
desc : "hello here is a comma , I am after the comma"}] 
+0

用雙引號引用您的文本值 – charlietfl

回答

2

變化如下

data.forEach(function(item) { 
    ctr = 0; 
    keys.forEach(function(key) { 
     if (ctr > 0) result += columnDelimiter; 
     result += "\"" + item[key].replace(/"/g, '\\"') + "\""; 
     ctr++; 
    }); 
    result += lineDelimiter; 
}); 

只需添加引號可以解決這個之間的文本問題。

+1

還應該使用內部雙引號......以防它們存在 – charlietfl