2014-01-21 151 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("\"", "")

相關問題