2017-08-12 46 views
0

我想用我的字符串“”(逗号),但我的字符串有一些特殊的情况下,请帮我如何拆分我在Javascript字符串的特殊情况

input : a,"d,e,f",g //string in csv` 

    var myarray=str.spilt(","); 

输出:myarray[0] = a ,myarray[1]="d ,myarray[3]=e,myarray[4]=f.....

所需的输出:myarray[0] =a ,myarray[1]="d,e,f",myarray[2] = g

请帮我... 感谢

+0

是''a,“d,e,f”,g“'真的是字符串吗? – Stuart

+0

你的字符串的来源是什么?我认为你需要一个解析器来处理这个问题。 –

+0

其字段来自csv文件 –

回答

1

小非正则表达式,迭代和慢的方法:

var result = [], tmp="", inString = false; 
str.split("").forEach(function(char){ 
    inString = inString != (char === '"'); 
    if(!inString && char === ","){ 
    result.push(tmp); 
    tmp = ""; 
    }else{ 
    tmp+=char; 
    } 
}); 
result.push(tmp); 

In action

你也可以使用A R用于循环而不是forEach:

for(char of str){ /*...*/ } 

然而,这就是你。

+0

我仍然不明白为什么人们downvote没有说出什么是错的:/ –

-1

可以清理CSV与添加分隔符“,以创建n个新闻专栏。这是在Excel中,但我不知道你如何解析这些数据,所以可能不适合你。或者str_replace()他们然后str.split

+0

应该如何替换'''工作,如果结果应该是'['a','d,e,f','g']'的形式的数组? –

0

你需要使用regexp

var str = 'a,"d,e,f",g'; 
 
console.log(str.split(/,"|",/));

+0

这只适用于特殊'',''或'',''将成为分隔符的情况。但是根据评论,OP正在寻找一种解决方案,引用的列可以出现在该行的任何位置。 –

+0

当你问为什么你不告诉所有情况下 –

+0

我的答案是基于你的论点 –

0
myarray = [] 
while (str) { 
    start = str; 
    str = str.replace(/(".*?"|[^",]+|)($|,)/, function(match, group1) { 
     myarray.push(group1); 
     return ""; 
    }); 
    if (str == start) break; 
} 

上面的代码通过CSV字符串,将它可以添加到数组myarray的每个值。如果值为",因为它的第一个字符(可能包含逗号),它将匹配,直到达到下一个关闭"。否则,正则表达式只会查找下一个逗号。如果发现某个值没有关闭,则会自动停止,并且myarray将包含所有失败的值。空值(两个相邻的逗号)也将起作用。

+0

不适用于更长的行,如OP在评论'704-wew-9494 ,“ds daf 787,erwerwe,NC 28134”,,,, 4/22/2013,5/1/2017,01, –

+0

我在其中添加了一个逗号,所以现在它正确匹配空值。除此之外,它似乎用给定的字符串为我工作。 – ChristianFigueroa

2

在JS中使用mapcat操作符会更顺畅。

let input = 'a,"d,e,f",g' 
var result = [] 
input.split('"').forEach((e, i) => { 
    result = result.concat(i % 2 == 0 ? e.split(',') : e) 
}) 
result = result.filter(e => e != "") 

由于ChristianFigueroa指出:这不会对在报价不环绕整场情况下工作:value,val"ue", "value"

然而,如果不是对你很重要: jsperf/speedtest

+0

如果值中包含引号,则位不是第一个字符。 (例如value,val“ue,”value“)。没有规则说明报价不能出现在其中一个值内 – ChristianFigueroa

+0

好的方法!但不是结果而是被* string/not string *分割?例如”a + b'” –