3

以下の入力文字列について考えてみます。

var inputString = "Config: EbizNewTestProject.dll PaymentSOAUrl for Paid: http://111.11.11.111/Payment.asp?" + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;
            inputString += "Config: EbizNewTestProject.dll PaymentSOAUrl for Paid: http://111.11.11.111/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;
            inputString += "Config: PartnerServicesTestBase.dll PaymentSOAUrl for Paid: https://172.31.26.38/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>5000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;
            inputString += "Config: PartnerServicesTestBase.dll PaymentSOAUrl for Paid: https://172.31.26.38/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>5000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>" + Environment.NewLine;
            inputString += "Config: EbizNewTestProject.dll PaymentSOAUrl for Paid: http://111.11.11.111/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;

「例外」の文字列の内容を観察してみましょう(与えられた例では全部で5つあります)。

最初の1つ

Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: 

二つ目

Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>:

三つ目

Exception: <Response> <ReturnCode>5000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>:

フォースワン

Exception: <Response> <ReturnCode>5000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>:

FifthOne

Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>:

注意深く見ると、最初のケースと2番目のケースは同じです。3番目と4番目もそうです。5番目は1番目/2番目と同じです。

私がする必要があるのは、最初と2番目、または連続する「例外」テキストが同一である場合、最初のテキストを残すと、他のテキストは「例外:--DO--」に置き換えられるということです。同一の文字列が見つかったが連続していない場合は、そのまま表示されます。

今後、出力は次のようになります(元の文字列はすべて同じままで、一致する例外のみが以下に示すように更新されます)

最初の1つ

Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>:

SecondOne(Firstoneと同一であり、連続しているため)

Exception: --DO--

ThirdOne(新しいものであるため)

Exception: <Response> <ReturnCode>5000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>:

FourOne(Thirdoneと同一であり、連続しているため)

Exception: --DO--

FifthOne(ただし、1番目/ 2番目のものと同じですが、連続したシーケンスではありません)

Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>:

私はこのプログラムをしました。まず、インデックス(開始と終了)に基づいて例外の内容を取得し、次に値をコレクション内に格納します。次に、ループを使用して、最初と2番目の内容を確認し、必要な更新を行いました。

しかし、これよりも優れた解決策はたくさんあると思います(正規表現、linq、ラムダの組み合わせなど)。

この問題を効率的に解決するための支援が必要です。

ありがとう

4

3 に答える 3

0

正規表現に関しては、私はまだ主要な初心者ですが、それらを使用してそれを行うことができるようです...

私はまだこれに取り組んでおり、十分な速さでそこに着くことができない場合、教祖があなたを正しい方向に向けることができることを望んでいますが、これは私がこれまでに持っているものです:

一致する正規表現:

((Exception.*?)(?=Exception)){2}

基本的に、「Exception」という単語で始まる文字列を探し、次に「Exception」という単語が表示されるまですべてを一致させてから(ただし、2回目は一致しない)、同じ文字列のコピーを2つ探します。

置き換える正規表現:

$1Exception: --DO--

つまり、最初に表示されたときは保持し、2回目は「例外:--DO--」に置き換えます。

これが少なくともあなたを正しい道に導いてくれることを願っています、私もそれで遊んでいきます。(繰り返しになりますが、申し訳ありませんが、正規表現はまだ私にはかなり新しいものです。ここでそれがクールな解決策になることを私は知っています)

于 2013-03-25T14:09:17.917 に答える
-1

私はあなたのために多くの苦痛を処理するXML逆シリアル化について調べます:

輸入:

using System.Xml.Serialization;
using System.Text.RegularExpressions;

コード:

//find the Reponses with regex
MatchCollection  matches = Regex.Matches(inputString, "<Response>(.)+</Response>");

XmlSerializer serializer = new XmlSerializer(typeof(Response));

List<Response> entityList = new List<Response>();


//Deserialize the reponses
foreach (Match item in matches)
{
    using(System.IO.TextReader rdr = new StringReader(item.Value))
    {
        Response entity = (Response)serializer.Deserialize(rdr);
        entity.Line = item.Value;
        entityList.Add(entity);
    }
}

//now you have real objects which you can treat however you want. Example just a loop or linq or whatever
for (int i = 0; i < entityList.Count; i++)
{
    if (i > 0 && entityList[i - 1].ReturnCode == entityList[i].ReturnCode)
        Console.Out.WriteLine("--DO--");
    else
        Console.Out.WriteLine(entityList[i].Line);
}

およびエンティティ:

public class Response
{
    [XmlElement("ReturnCode")]
    public int ReturnCode { get; set; }

    [XmlIgnore()]
    public string Line { get; set; }
}
于 2013-03-25T13:42:52.323 に答える
-1

これが私の最終バージョンです

var inputString = "Config: EbizNewTestProject.dll PaymentSOAUrl for Paid: http://111.11.11.111/Payment.asp?" + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;
            inputString += "Config: EbizNewTestProject.dll PaymentSOAUrl for Paid: http://111.11.11.111/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;
            inputString += "Config: PartnerServicesTestBase.dll PaymentSOAUrl for Paid: https://172.31.26.38/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>5000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;
            inputString += "Config: PartnerServicesTestBase.dll PaymentSOAUrl for Paid: https://172.31.26.38/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>5000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;
            inputString += "Config: EbizNewTestProject.dll PaymentSOAUrl for Paid: http://111.11.11.111/Payment.asp? " + Environment.NewLine;
            inputString += "Exception: <Response> <ReturnCode>4000</ReturnCode> <SuccessCode>NO</SuccessCode> <ReturnDesc>System Error</ReturnDesc> <ReturnURL>http://localhost/Default.aspx</ReturnURL> <CustomParameter /> </Response>: " + Environment.NewLine;


            TextReader reader = new StringReader(inputString);
            string line = null;
            StringBuilder sb = new StringBuilder();
            string firstLine = null;


            //append the first line
            sb.AppendLine(reader.ReadLine());

            //read the first exception line
            firstLine = reader.ReadLine();
            sb.AppendLine(firstLine);



            while ((line = reader.ReadLine()) != null)
            {
                if (line.StartsWith("Exception:"))
                {

                    if (line == firstLine)
                    {
                        sb.AppendLine("Exception:-- Do --");
                    }

                    if (line != firstLine)
                    {
                        sb.AppendLine(line);
                        firstLine = line;

                    }
                }
                else
                {
                    sb.AppendLine(line);
                }
            }


            Console.WriteLine(sb.ToString());

            Console.ReadKey();
于 2013-03-27T02:08:45.890 に答える