1

次のような内容のログファイルがあります。

2012-07-16 03:20:41,23796160897、Text、id:SAR-23796160897-c0-2-1 sub:000 dlvrd:001送信日:120715220216完了日:120716032038 stat:DELIVRD err:000 text:、FOTSO TOKAM、SMSCReceiptMsgId = SAR-23796160897-c0-2-1
2012-07-16 03:20:48,23796160897、Text、id:SAR-23796160897-c0-2-2 sub:000 dlvrd:001送信日:120715220216完了日:120716032045 stat:DELIVRD err:000 text:、FOTSO TOKAM、SMSCReceiptMsgId = SAR-23796160897-c0-2-2
2012-05-04 00:07:46,23777603300、Text、id:4FA23EB0 sub:000 dlvrd:001送信日:120503225018完了日:120504000744stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23EB0
2012-05-04 01:50:18,23796726987、Text、id:4FA23E95 sub:000 dlvrd:001送信日:120503225014完了日:120504015016stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23E95
2012-05-04 01:50:22,23799757015、Text、id:4FA23EB2 sub:000 dlvrd:001送信日:120503225018完了日:120504015021 stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23EB2
2012-05-04 01:50:48,23799907239、Text、id:4FA23F38 sub:000 dlvrd:001送信日:120503225042完了日:120504015046 stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23F38
2012-05-04 01:50:48,23799896455、Text、id:4FA23D1C sub:000 dlvrd:001送信日:120503175232完了日:120504015046 stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23D1C
2012-05-04 01:50:48,23799896455、Text、id:4FA23F04 sub:000 dlvrd:001送信日:120503225031完了日:120504015046 stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23F04
2012-05-04 01:50:50,23794105044、Text、id:4FA23F55 sub:000 dlvrd:001送信日:120503225046完了日:120504015048 stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23F55
2012-05-04 01:51:19,23796029764、Text、id:4FA23FEE sub:000 dlvrd:001送信日:120503225114完了日:120504015117stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23FEE
2012-05-04 02:17:51,23775461594、Text、id:4FA24025 sub:000 dlvrd:001送信日:120503225125完了日:120504021749 stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA24025
2012-05-04 04:08:02,23777437781、Text、id:4FA23F23 sub:000 dlvrd:001送信日:120503225037完了日:120504040800stat:DELIVRD err:000 text:、FLP、SMSCReceiptMsgId = 4FA23F23
2012-05-04 04:50:12,23777970013、Text、id:4FA23E70 sub:000 dlvrd:000 submit date:120503225005 done date:120504045011 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23E70
2012-05-04 04:50:15,23775182832、Text、id:4FA23E7E sub:000 dlvrd:000 submit date:120503225008 done date:120504045014 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23E7E
2012-05-04 04:50:17,23777789644、Text、id:4FA23E80 sub:000 dlvrd:000 submit date:120503225010 done date:120504045016 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23E80
2012-05-04 04:50:21,23777529371、Text、id:4FA23E8F sub:000 dlvrd:000 submit date:120503225013 done date:120504045019 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23E8F
2012-05-04 04:50:21,23777613852、Text、id:4FA23E97 sub:000 dlvrd:000 submit date:120503225014 done date:120504045020 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23E97
2012-05-04 04:50:24,23777407598、Text、id:4FA23EAE sub:000 dlvrd:000 submit date:120503225017 done date:120504045023 stat:EXPIRED err:032 text:、FLP、SMSCReceiptMsgId = 4FA23EAE
2012-05-04 04:50:26,23777736950、Text、id:4FA23EAF sub:000 dlvrd:000 submit date:120503225018 done date:120504045024 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23EAF
2012-05-04 04:50:31,23775834128、Text、id:4FA23ED6 sub:000 dlvrd:000 submit date:120503225024 done date:120504045030 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23ED6
2012-05-04 04:50:36,23777486441、Text、id:4FA23EF3 sub:000 dlvrd:000 submit date:120503225029 done date:120504045035 stat:EXPIRED err:027 text:、FLP、SMSCReceiptMsgId = 4FA23EF3

ここで、c#.netとLINQで正規表現を使用して、「id、done date、stat」などのいくつかの特定のフィールドのこのコンテンツから値を取得したいと思います。

誰かがそれをする考えを持っているなら私を助けてください。

4

3 に答える 3

2

ここで正規表現が役立つとは思いません。むしろ、行を行に分割してから列に分割する必要があります。データをマトリックスに分割して、探している情報を簡単に抽出できるようにすることができます... JavaScript/C#/Javaでもこれを行うことができますまたは任意の言語。

私の実践では、これを行います:

  • データを行に分割する
  • 行を列に分割する
  • 次に、各行を繰り返し、探している列をポイントします。

    var content = data.split('\n');
    foreach(var line in content) 
    {
         var cols = line.split(',');
         var c1 = cols[0];
         var c2 = cols[1];
         var c3 = cols[2];
    }
    

上記の抜粋を必要に応じて改良することができます...これが最善の方法です。

于 2012-07-17T10:50:47.787 に答える
1

すべてのフィールドが何を意味するのか、または区切り文字が一定であるかどうかは明確ではありません。提供したテスト データを使用して、ほとんどの情報を名前付きグループに取得します。

/// <summary>
///  Regular expression built for C# on: Tue, Jul 17, 2012, 12:08:12 PM
///  Using Expresso Version: 3.0.4334, http://www.ultrapico.com
///  
///  A description of the regular expression:
///  
///  Beginning of line or string
///  [Date]: A named capture group. [[^,]+]
///      Any character that is NOT in this class: [,], one or more repetitions
///  ,
///  [Number]: A named capture group. [[^,]+]
///      Any character that is NOT in this class: [,], one or more repetitions
///  ,
///  [Text1]: A named capture group. [[^,]+]
///      Any character that is NOT in this class: [,], one or more repetitions
///  ,
///  id:
///      id:
///  [ID]: A named capture group. [[^\s]+]
///      Any character that is NOT in this class: [\s], one or more repetitions
///  Whitespace
///  sub:
///      sub:
///  [Sub]: A named capture group. [\w+]
///      Alphanumeric, one or more repetitions
///  Whitespace
///  dlvrd:
///      dlvrd:
///  [Dlvrd]: A named capture group. [\w+]
///      Alphanumeric, one or more repetitions
///  Whitespace
///  submit\sdate:
///      submit
///      Whitespace
///      date:
///  [SubmitDate]: A named capture group. [\w+]
///      Alphanumeric, one or more repetitions
///  Whitespace
///  done\sdate:
///      done
///      Whitespace
///      date:
///  [DoneDate]: A named capture group. [\w+]
///      Alphanumeric, one or more repetitions
///  Whitespace
///  stat:
///      stat:
///  [Status]: A named capture group. [\w+]
///      Alphanumeric, one or more repetitions
///  Whitespace
///  err:
///      err:
///  [Error]: A named capture group. [\d+]
///      Any digit, one or more repetitions
///  Whitespace
///  
///
/// </summary>
public static Regex regex = new Regex(
      "^(?<Date>[^,]+),\r\n(?<Number>[^,]+),\r\n(?<Text1>[^,]+),\r\nid:(?"+
      "<ID>[^\\s]+)\\s\r\nsub:(?<Sub>\\w+)\\s\r\ndlvrd:(?<Dlvrd>\\w+)\\s"+
      "\r\nsubmit\\sdate:(?<SubmitDate>\\w+)\\s\r\ndone\\sdate:(?<DoneD"+
      "ate>\\w+)\\s\r\nstat:(?<Status>\\w+)\\s\r\nerr:(?<Error>\\d+)\\s",
    RegexOptions.Multiline
    | RegexOptions.ExplicitCapture
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
    );

したがって、これを使用して、次のように呼び出すことができます。

var matches = regex.Matches(inputData);

個人的には、テストを 1 行のデータに制限し、代わりにこれを呼び出すことをお勧めします。

var match = regex.Match(inputLineOfData);

これは、次のことができることを意味します。

if ( match.Success )
{
   var id = match.Groups["ID"].Value;
   var submitDate = match.Groups["SubmitDate"].Value;  // Parse to DateTime
   var doneDate = match.Groups["DoneDate"].Value;  // Parse to DateTime

   // etc for 'sub', 'dlvrd', 'Status', 'Error'..
}
于 2012-07-17T11:14:54.883 に答える
0

おそらく csv パーサーの方が良いでしょうが、この正規表現を使用して id: を必要な他のフィールドに置き換えることができます。元done date:(?<done date>.*?)\s

string strRegex = @"id:(?<id>.*?)\s.*?done date:(?<donedate>.*?)\s.*?stat:(?<stat>.*?)\s";
RegexOptions myRegexOptions = RegexOptions.IgnoreCase | RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"2012-07-16 03:20:41,23796160897,Text,id:SAR-23796160897-c0-2-1 sub:000 dlvrd:001 submit date:120715220216 done date:120716032038 stat:DELIVRD err:000 text:,FOTSO TOKAM,SMSCReceiptMsgId=SAR-23796160897-c0-2-1"
foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here 
    //myMatch.Groups["id"].Value;
    //myMatch.Groups["donedate"].Value;
    //myMatch.Groups["stat"].Value;
  }
}

1つの正規表現id:(?<id>.*?)\s.*?done date:(?<donedate>.*?)\s.*?stat:(?<stat>.*?)\sを使用して、次のようなグループでアクセスできますmyMatch.Groups["id"].Value

于 2012-07-17T10:44:35.840 に答える