【问题标题】:How to replace commas within strings when converting a CSV to JSON (JS)将 CSV 转换为 JSON (JS) 时如何替换字符串中的逗号
【发布时间】:2019-04-18 13:57:27
【问题描述】:

我在尝试使用 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"
   },

【问题讨论】:

  • 要在哪个字段中去掉逗号
  • "我尝试更改分隔符,但由于某种原因,当我阅读 CSV JS 时忽略了设置的分隔符并将它们转换为逗号。"...上面的代码始终使用逗号。你能告诉我们一个你做了什么的例子吗?你的陈述并不完全有意义......代码不会“忽略”事情,它只是按照它的指示做,所以也许你犯了一些小错误。另请显示将转换为上述 JSON 的源 CSV 数据。这样会清楚很多。通常,CSV 会在字段周围加上双引号,这样您就可以知道哪些位是分隔符,哪些是内容
  • 我不想删除逗号,你可以看到我用逗号分割 CSV 数据,这会导致数据与正确的标题不匹配。更改分隔符似乎不起作用,JS总是以逗号作为分隔符读取文件。
  • result.csv 的内容是什么
  • 你能发一个简单的样本数据(csv)吗?

标签: javascript jquery arrays json csv


【解决方案1】:

由于您的所有值都包含在引号中,因此您应该将拆分参数更改为 only splits when a comma is outside of a pair of quotes 的正则表达式。

由于数据的格式化方式,您应该记住,您将需要清理大量不必要的转义引号字符串。但是你必须确保你不会不小心清理任何已经在 csv 中转义的引号。但我想这些边缘情况是人们使用预建库的原因。

编辑

关于我之前的陈述。您可能只需删除字符串开头和结尾的引号即可。但我只是要抛出一个免责声明,并说您获得此结果的里程可能会因您的数据而异。

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); 
  }

【讨论】:

  • 我在您的答案中编辑了 CSV 数据,以包含我的所有数据,而不仅仅是前两行,请注意错误,我在查找未定义值时遇到了一些麻烦,我是在谈到 chromes 调试工具时有点笨拙,有什么想法吗?
  • 我看到了。错误来自输入末尾的尾随换行符。删除它,它的工作原理。请注意,我使用了模板文字字符串,因此代码中的任何换行符也将在字符串中。但这是使用预构建解析器的另一个极端原因。您不必处理文件开头或结尾处的空白空间。
  • 空白实际上是你的自制解析器的一个小问题。但是,如果您想快速解决问题,您可以在开始解析之前在 csv 字符串上使用 trim。甚至可能在每条线上。但这取决于你。
  • 已排序,您的解决方案完美运行。自我注意:停止尝试远离正则表达式
猜你喜欢
  • 2017-02-25
  • 2019-11-18
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2020-11-27
  • 1970-01-01
  • 2019-11-12
相关资源
最近更新 更多