代码之家  ›  专栏  ›  技术社区  ›  M T

如何在将CSV转换为JSON(JS)时替换字符串中的逗号

  •  1
  • M T  · 技术社区  · 7 年前

    我在尝试使用JS将客户端提供的CSV转换为JSON数据时遇到映射问题。CSV中的一列包含包含逗号的地址数据。我尝试过更改分隔符,但由于某种原因,当我阅读CSV时,JS会忽略设置的分隔符并将其转换为逗号。这意味着将数据转换为JSON时的映射不正确。代码和输出如下:-

    JS:-

        $(document).ready(function() {
        $.ajax({
            type: "GET",
            url: "result.csv",
            dataType: "text",
            success: function(data) { $("body").append(csvJSON(data));}
         });
    });
    
    function csvJSON(csv){
    
        var lines=csv.split("\n");
    
        var result = [];
    
        var headers=lines[0].split(",");
    
        for(var i=1;i<lines.length;i++){
    
            var obj = {};
            var currentline=lines[i].split(",");
    
    
            for(var j=0;j<headers.length;j++){
    
                obj[headers[j]] = currentline[j];
            }
    
            result.push(obj);
    
        }
    
        return JSON.stringify(result); 
      }
    

    CSV数据:-

    "type","geometry__type","geometry__coordinates__001","geometry__coordinates__002","properties__name","properties__address","properties__address2","properties__city","properties__state","properties__postal","properties__country","properties__phone","properties__phoneFormatted","properties__email","properties__web"
    "Stockist","Point",-110.788,43.4705,"Whitechapel Ltd","Box 11719, 1135 Maple Way","Jackson,","Wyoming","WY",83002,"US",13077399478,"+1 307 739-9478","whitechapel@wyoming.com","www.whitechapel-ltd.com"
    "Stockist","Point",103.82705,1.30637,"Thrive Design & Trading","19, Tanglin Road, #03-35","Tanglin Shopping Centre","Singapore",,247909,"Singapore","65-67357333","65-67357333","francis@thrive-products.com.sg",
    

    当前结果:-

       {  
          "type":"Stockist",
          "geometry__type":"Point",
          "geometry__coordinates__001":"-110.788",
          "geometry__coordinates__002":"43.4705",
          "properties__name":"Whitechapel Ltd",
          "properties__address":"\"Box 11719",
          "properties__address2":" 1135 Maple Way\"",
          "properties__city":"\"Jackson",
          "properties__state":"\"",
          "properties__postal":"Wyoming",
          "properties__country":"WY",
          "properties__phone":"83002",
          "properties__phoneFormatted":"US",
          "properties__email":"13077399478",
          "properties__web\r":"+1 307 739-9478"
       },
    

    预期结果:-

      {  
          "type":"Stockist",
          "geometry__type":"Point",
          "geometry__coordinates__001":"-110.788",
          "geometry__coordinates__002":"43.4705",
          "properties__name":"Whitechapel Ltd",
          "properties__address":"Box 11719, 1135 Maple Way",
          "properties__address2":"Jackson,",
          "properties__city":"Wyoming",
          "properties__state":"WY",
          "properties__postal":"83002",
          "properties__country":"US",
          "properties__phone":"13077399478",
          "properties__phoneFormatted":"+1 307 739-9478",
          "properties__email":"whitechapel@wyoming.com",
          "properties__web":"www.whitechapel-ltd.com"
       },
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   M T    7 年前

    由于所有值都用引号括起来,所以应该将分割参数更改为 only splits when a comma is outside of a pair of quotes .

    编辑

    const csv=`\"type","geometry__type","geometry__coordinates__001","geometry__coordinates__002","properties__name","properties__address","properties__address2","properties__city","properties__state","properties__postal","properties__country","properties__phone","properties__phoneFormatted","properties__email","properties__web"
    "Stockist","Point",-110.788,43.4705,"Dummy address","Box 11719, 1135 Maple Way","Jackson,","Wyoming","WY",83002,"US",12313213213213,"+111111111","dummy ","dummy web address"`
    
    console.log(csvJSON(csv))
    
    function csvJSON(csv){
    
        var lines=csv.split("\n");
    
        var result = [];
        
        var commaRegex = /,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/g
        
        var quotesRegex = /^"(.*)"$/g
    
        var headers = lines[0].split(commaRegex).map(h => h.replace(quotesRegex, "$1"));
    
        for(var i=1;i<lines.length;i++){
    
            var obj = {};
            var currentline=lines[i].split(commaRegex);
    
    
            for(var j=0;j<headers.length;j++){
    
                obj[headers[j]] = currentline[j].replace(quotesRegex, "$1");
            }
    
            result.push(obj);
    
        }
        return result;
        //return JSON.stringify(result); 
      }