尝试使用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"
},
答案 0 :(得分:3)
由于所有值都用引号引起来,因此应将split参数更改为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);
}