2012-12-04 78 views
0

提取數據我試圖處理來自系統的報告,給了我下面的代碼從純文本字符串

000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e} 

我需要提取的花括號{之間的值},並將其保存在變量。我假設我需要使用正則表達式或類似的方法來做到這一點?我真的不知道從哪裏開始!我使用C#asp.net 4.

我需要以下變量

param1 = 000 
param2 = GEN 
param3 = OK 
param4 = 1 //Q 
param5 = 1 //M 
param6 = 002 //B 
param7 = 3e5e65656-e5dd-45678-b785-a05656569e //I 

我將其命名爲根據他們的實際意思PARAMS。任何人都可以在這裏幫我嗎?我試圖根據空格進行拆分,但我得到了其他垃圾!

感謝您的指點/幫助!

+0

split =「?」?它會一直採用這種格式嗎? – CR41G14

+0

當你想捕獲'GEN','OK'時他們總是會在那裏 – Anirudha

回答

0

我會建議這種類型的工作的正則表達式。

var objRegex = new System.Text.RegularExpressions.Regex(@"^(\d+)=\[([A-Z]+)\] ([A-Z]+) \{Q=(\d+) M=(\d+) B=(\d+) I=([a-z0-9\-]+)\}$"); 
var objMatch = objRegex.Match("000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e}"); 
if (objMatch.Success) 
{ 
    Console.WriteLine(objMatch.Groups[1].ToString()); 
    Console.WriteLine(objMatch.Groups[2].ToString()); 
    Console.WriteLine(objMatch.Groups[3].ToString()); 
    Console.WriteLine(objMatch.Groups[4].ToString()); 
    Console.WriteLine(objMatch.Groups[5].ToString()); 
    Console.WriteLine(objMatch.Groups[6].ToString()); 
    Console.WriteLine(objMatch.Groups[7].ToString()); 
} 

我剛剛測試過,它適用於我。

3

如果格式是相當恆定的,你可以使用.NET的字符串處理方法拉出值,沿東西的

string line = 
    "000=[GEN] OK {Q=1 M=1 B=002 I=3e5e65656-e5dd-45678-b785-a05656569e}"; 

int start = line.IndexOf('{'); 
int end = line.IndexOf('}'); 
string variablePart = line.Substring(start + 1, end - start); 
string[] variables = variablePart.Split(' '); 
foreach (string variable in variables) 
{ 
    string[] parts = variable.Split('='); 
    // parts[0] holds the variable name, parts[1] holds the value 
} 

寫到這了我的頭頂部的線條,所以有可能是某處出現錯誤的錯誤。另外,建議增加錯誤檢查,例如以確保輸入字符串同時具有{和a}。

+0

+1的非正則表達式解決方案。 – andleer

+0

雖然這是'regex'的一種替代方法,但是您仍然在使它變得複雜......''regex'會以更好的方式做到這一點,而不會混淆代碼......這也會導致數組的操作無法執行, t want..he想要存儲它在單個變量..非正則表達式的解決方案不建議在這裏.. – Anirudha

+0

@ Some1.Kill.The.DJ:也許。這真的取決於要求。 RegEx通常*速度較慢*。將我的代碼和hal.stephenk的代碼放入一個簡單的控制檯應用程序中,每運行1,000,000次(僅重複「objRegex.Match」,而不是「新的RegularExpression」),我的代碼顯示爲1.052秒,代碼爲6.663秒。有時候,這個表現很重要。有時它不會。 RegEx是一種通用的模式匹配解決方案。它幾乎不會像用戶編寫的代碼一樣快,但它的寫入速度會更快。 –

0

使用正則表達式。

快速和骯髒的嘗試:

(?<ID1>[0-9]*)=\[(?<GEN>[a-zA-Z]*)\] OK {Q=(?<Q>[0-9]*) M=(?<M>[0-9]*) B=(?<B>[0-9]*) I=(?<I>[a-zA-Z0-9\-]*)} 

這將生成一個名爲組,即ID1GENQMBI

有關在C#中使用正則表達式的詳細信息,請查閱MSDN docs

您可以使用Regex Hero進行快速C#正則表達式測試。

0

您可以使用String.Split

string[] parts = s.Split(new string[] {"=[", "] ", " {Q=", " M=", " B=", " I=", "}"}, 
         StringSplitOptions.None); 
0

該解決方案打破了你的報告代碼爲段並存儲所需的值到一個數組。

正則表達式一次匹配一個報告代碼段,並將相應的值存儲在「已解析報告代碼數組」中。

正如您的示例所暗示的,前兩個代碼段的處理方式與之後的不同。我做了這樣的假設:它總是前兩個不同的處理段。

private static string[] ParseReportCode(string reportCode) { 
    const int FIRST_VALUE_ONLY_SEGMENT = 3; 
    const int GRP_SEGMENT_NAME = 1; 
    const int GRP_SEGMENT_VALUE = 2; 
    Regex reportCodeSegmentPattern = new Regex(@"\s*([^\}\{=\s]+)(?:=\[?([^\s\]\}]+)\]?)?"); 
    Match matchReportCodeSegment = reportCodeSegmentPattern.Match(reportCode); 

    List<string> parsedCodeSegmentElements = new List<string>(); 
    int segmentCount = 0; 
    while (matchReportCodeSegment.Success) { 
     if (++segmentCount < FIRST_VALUE_ONLY_SEGMENT) { 
      string segmentName = matchReportCodeSegment.Groups[GRP_SEGMENT_NAME].Value; 
      parsedCodeSegmentElements.Add(segmentName); 
     } 
     string segmentValue = matchReportCodeSegment.Groups[GRP_SEGMENT_VALUE].Value; 
     if (segmentValue.Length > 0) parsedCodeSegmentElements.Add(segmentValue); 
     matchReportCodeSegment = matchReportCodeSegment.NextMatch(); 
    } 
    return parsedCodeSegmentElements.ToArray(); 
} 
相關問題