2011-12-23 48 views
0

如何拆分此字符串分割字符串與「在C#

1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1 

,並獲得該字符串數組作爲結果

1014 
'0,1031,1032,1034,1035,1036' 
0 
0 
1 
1 
0 
1 
0 
-1 
1 
在C#

+0

調用正則表達式pro!,檢查出各種CSV解析器,它們都處理這個(和更多)。 http://www.filehelpers.com/ – Prescott 2011-12-23 08:19:27

+0

試過String.Split API? – Zenwalker 2011-12-23 08:19:37

+1

正常情況下,當字符串被拆分時,主元字符被刪除。在這種情況下,第二個結果包含在撇號中。輸入字符串中是否會有兩個以上的撇號?如果是這樣,會發生什麼? – Amy 2011-12-23 08:20:02

回答

1

試試這個,

string line ="1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1" ; 
var values = Regex.Matches(line, "(?:'(?<m>[^']*)')|(?<m>[^,]+)"); 
foreach (Match value in values) { 
    Console.WriteLine(value.Groups["m"].Value); 
} 
+2

此答案不保留引號 - 正如問題所要求的那樣。 – 2011-12-23 08:42:11

0

首先上'分割的字符串(單個)報價後再去comma(,)。

+0

...只分割偶數索引的字符串,並且再次用單引號包圍奇數索引的字符串。然後將所有結果連接爲一個數組。 – Rawling 2011-12-23 08:20:47

5

我認爲,這正則表達式應該給你你在找什麼:

('(?:[^']|'')*'|[^',\r\n]*)(,|\r\n?|\n)? 

http://regexr.com?2vib4

編輯:

它是如何發揮作用

快速的代碼片段:

var rx = new Regex("('(?:[^']|'')*'|[^',\r\n]*)(,|\r\n?|\n)?"); 
var text= "1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1"; 

var matches = rx.Matches(text); 

foreach (Match match in matches) 
{ 
    System.Console.WriteLine(match.Groups[1].ToString()); 
} 
+0

這是最好的答案,因爲它處理字符串內的多個字符串。並保持報價。 – NoLifeKing 2011-12-23 08:34:51

+0

@NoLifeKing我肯定傾向於同意:) – 2011-12-23 08:35:54

1

這段代碼根本不漂亮,但是很有效。 :)(不與字符串中的多個「串」的工作。)

void Main() 
{ 
    string stuff = "1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1"; 
    List<string> newStuff = new List<string>(); 

    var extract = stuff.Substring(stuff.IndexOf('\''), stuff.IndexOf('\'', stuff.IndexOf('\'') + 1) - stuff.IndexOf('\'') + 1); 
    var oldExtract = extract; 
    extract = extract.Replace(',',';'); 
    stuff = stuff.Replace(oldExtract, extract); 
    newStuff.AddRange(stuff.Split(new[] {','})); 
    var newList = newStuff; 
    for(var i = 0; i < newList.Count; i++) 
     newList[i] = newList[i].Replace(';',','); 
    // And newList will be in the format you specified, but in a list.. 
} 
0

你並不需要一個解析器,你不需要正則表達式。這裏是一個非常簡單的版本,完美的作品:

var splits = input 
      .Split('\'') 
      .SelectMany(
       (s,i) => (i%2==0) 
       ? s.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries) 
       : new[]{ "'" + s + "'"} 
      ); 

這正是描述@AVD + @Rawling ...分割上',並拆分只有「連」的結果,然後結合。

0
using System; 
using System.IO; 
using Microsoft.VisualBasic.FileIO; //Microsoft.VisualBasic.dll 

public class Sample { 
    static void Main(){ 
     string data = "1014,'0,1031,1032,1034,1035,1036',0,0,1,1,0,1,0,-1,1"; 
     string[] fields = null; 
     data = data.Replace('\'', '"'); 
     using(var csvReader = new TextFieldParser(new StringReader(data))){ 
      csvReader.SetDelimiters(new string[] {","}); 
      csvReader.HasFieldsEnclosedInQuotes = true; 
      fields = csvReader.ReadFields(); 
     } 
     foreach(var item in fields){ 
      Console.WriteLine("{0}",item); 
     } 
    } 
}