2013-08-30 20 views
1

的子我已經在C#以下字符串字符串處理,提取特定的模式

Count([AssignedTo]) as [AssignedTo] , Sum([Billing Amount]) as [Billing Amount] , Max([Billing Rate]) as [Billing Rate] , Min([ExecutionDate]) as [ExecutionDate] , Average([HoursSpent]) as [HoursSpent] , [Project], [Sub-Project], [TaskName], [Vendor], [Work Classification], [Work Done], Count([WorkItemType]) as [WorkItemType] 

現在我想有聚合函數,所有字段的列表,通過字符串操作或linq

輸出像

Count([AssignedTo]) 

Sum([Billing Amount]) 

Max([Billing Rate]) 

Min([ExecutionDate]) 

Average([HoursSpent]) 

Count([WorkItemType]) 
+5

@Dwonvoters請憐憫評論ATLEAST –

+0

我沒有downvote,但它可能是因爲你還沒有證明你已經嘗試過任何解決自己這一點。這裏的人很樂意幫助解決具體問題,但我們並不是在這裏爲您編寫所有代碼。線索:你有一個STRING,你需要把它分解成若干部分,然後看看每個部分是否從一個可能的LIST開始創建一個特定的字符串。 – ZombieSheep

+0

是@ZombieSheep我試圖谷歌它,但沒有什麼值得發佈,所以我寫了,沒有發現任何想法 –

回答

2

也許這適合你:

var aggr = new []{ "Count", "Sum", "Max", "Min", "Average"}; 
var allAggregates = text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(col => new{ col, token = col.TrimStart().Split().First() }) 
    .Where(x => x.token.Contains('(') && aggr.Any(a => x.token.StartsWith(a, StringComparison.OrdinalIgnoreCase))) 
    .Select(x => x.token); 

DEMO

可我得到的字段名稱僅是內部功能

我喜歡串的方法,而不是正則表達式如果可能的話:

var allAggregates = text.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(col => new { col, token = col.TrimStart().Split().First() }) 
    .Where(x => x.token.Contains('(') && aggr.Any(a => x.token.StartsWith(a, StringComparison.OrdinalIgnoreCase))) 
    .Select(x => { 
     string innerPart = x.token.Substring(x.token.IndexOf('(') + 1); 
     int index = innerPart.IndexOf(')'); 
     if (index >= 0) 
      innerPart = innerPart.Remove(index); 
     return innerPart; 
    }); 
+0

你總是搖滾,謝謝兄弟,完美的解決方案 –

+0

我可以得到只有哪個字段的名稱裏面的功能 –

+0

@ pavezalam:編輯我的答案。 –

0
var aggregates = new []{ "Count", "Sum", "Max", "Min", "Average"}; 
var output=Regex.Matches(input,@"(\w+)\(.*?\)") 
       .Cast<Match>() 
       .Where(x=>aggregates.Any(y=>y==x.Groups[1].Value)) 
       .Select(z=>z.Value); 
0

這是另一種方式:

string[] funcNames = new string[]{"Sum","Average","Count","Max","Min"}; 
string s = "Your String"; 

var output = from v in s.Split(',') 
      where funcNames.Contains(v.Split('(')[0].Trim()) 
      select v.Split(new string[]{" as "}, 
          StringSplitOptions.RemoveEmptyEntries)[0].Trim(); 
      .Split('(')[1].Split(')')[0]; //this line is to get only field names 

//Print results 
foreach(var str in output) Console.WriteLine(str);