2014-01-21 152 views
5

我使用.NET的String.Split方法使用逗号分割字符串,但我想忽略字符串的双引号中的字符串。我已经读过拆分字符串并忽略引号内的分隔符

例如,下面的字符串。

Fruit,10,"Bananas, Oranges, Grapes" 

我想获得以下

Fruit 
10 
"Bananas, Oranges, Grapes" 

目前我得到以下输出

Fruit 
10 
"Bananas 
Oranges 
Grapes" 
enter code here 

以下建议后和答案提供的,这里是一个样本是我结束了。 (这对我很明显)

Imports Microsoft.VisualBasic.FileIO 

Dim fileReader As New TextFieldParser(fileName) 

fileReader.TextFieldType = FieldType.Delimited 
fileReader.SetDelimiters(",") 
fileReader.HasFieldsEnclosedInQuotes = True 

While fileReader.EndOfData = False 


Dim columnData() As String = fileReader.ReadFields 

' Processing of field data 

End While 
+4

使用可用的CSV解析器像['TextFieldParser'] (http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.hasfieldsenclosedinquotes(v=vs.110).aspx)或[this](http://www.codeproject.com)/Articles/9258/A-Fast-CSV-Reader) pport引用字符。 –

+0

['FileHelpers'](http://filehelpers.sourceforge.net/)是一个很好的CSV库。 –

+0

可能会有所帮助:http://stackoverflow.com/questions/18144431/regex-to-split-a-csv –

回答

5

你最好用解析器,就像评论中提到的解析器。这就是说,它是可能的正则表达式来做到这一点通过以下方式:

,(?=(?:[^"]*"[^"]*")*[^"]*$) 

正前瞻((?= ...))确保有偶数个报价的提前逗号分割的(即他们要么发生在对,或者没有)。

[^"]*匹配非引号字符。

1

快速解决方法可以预先解析引号内的逗号,并用另一个分隔符替换它们,拆分值并用分隔符用原始逗号代替它们后解析值。

0

如果使用C#,您可以使用

 string searchQuery = "Fruit,10,\"Bananas, Oranges, Grapes\""; 
     List<string> list1 = Regex.Matches(searchQuery, @"(?<match>\w+)|\""(?<match>[\w\s,]*)""").Cast<Match>().Select(m => m.Groups["match"].Value).ToList(); 
     foreach(var v in list1) 
     Console.WriteLine(v); 

输出:

水果

香蕉,橘子,葡萄

0

我发现下面是最简单的方法,我们可以做到

string fruits = "Fruit,10,"Bananas, Oranges, Grapes""; 
string[] fruitsArr = Regex.Split(fruits, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))"); 

输出:

fruitsArr[0] = "Fruit" 
fruitsArr[1] = "10" 
fruitsArr[2] = "\"Bananas, Oranges, Grapes\"" 

如果您需要纯粹的字符串数据,所以你可以做到这一点像,

fruitsArr[2].Replace("\"", "")

相关问题