簡體   English   中英

從純文本字符串中提取數據

[英]Extracting data from plain text string

我正在嘗試處理來自系統的報告,該系統為我提供以下代碼

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

我將根據其實際含義來命名這些參數。 有人可以在這里幫我嗎? 我試圖根據空間進行拆分,但是我得到了其他垃圾!

感謝您的任何指示/幫助!

如果格式相當恆定,則可以使用.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
}

把它寫在我的頭頂上,所以某個地方可能會有一個錯誤的錯誤。 此外,建議添加錯誤檢查,例如確保輸入字符串同時包含{和}。

使用正則表達式。

快速而骯臟的嘗試:

(?<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命名組。

請查閱MSDN文檔,以獲取有關在C#中使用正則表達式的詳細信息。

您可以使用Regex Hero進行快速的C#regex測試。

我建議為此類工作使用正則表達式。

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());
}

我剛剛測試了一下,對我來說效果很好。

您可以使用String.Split

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

此解決方案將您的報告代碼分解為多個段,並將所需的值存儲到數組中。

正則表達式一次匹配一個報告代碼段,並將適當的值存儲在“已分析的​​報告代碼數組”中。

如您的示例所示,前兩個代碼段的處理方式與之后的代碼段不同。 我假設總是前兩個段被不同地處理。

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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM