2013-03-05 93 views
2

我有一個報表服務器,需要解析一個字符串與控制報告中的內容的一些參數。Sprache分析器與自定義字段

我正在使用解析器庫sprache來幫助解決這個問題。所有工作都很好,除了我被困住的一件事。

我有一個時間過濾器,可以是以下值之一:今天,昨天,上週,上個月,沒有或自定義。

這是自定義,給了我一些悲傷。所有其他人都只是簡單的字符串。自定義之後還有一個來自和去往的屬性。

private static readonly Parser<DataFilterEntity> TimeFilter = 
     from filter in Parse.String("today").Return(DataFilterEntity.Today) 
      .Or(Parse.String("yesterday").Return(DataFilterEntity.Yesterday) 
      .Or(Parse.String("last week").Return(DataFilterEntity.LastWeek) 
      .Or(Parse.String("last month").Return(DataFilterEntity.LastMonth) 
      .Or(Parse.String("none").Return(DataFilterEntity.None)) 
      .Or(Parse.String("custom").Return(DataFilterEntity.Custom()))))) 
     select filter; 

自定義行是問題所在。我需要解析「自定義」字符串,但然後解析來自和日期時間字段,並將它們傳遞給DataFilterEntity.Custom(from,to)

任何想法非常讚賞。

+0

你能展示這樣一個「自定義」數據的例子嗎? – Michael 2013-03-05 09:21:43

+0

定製2012/12/25 2013/1/1第一個日期是「從」第二個「到」。然後傳遞給DataFilterEntity.Custom(from,to) – 2013-03-05 09:23:33

+0

好的,你會得到一個錯誤還是它不解析定製內容?自定義過濾器如何看起來像現在這樣?是否指定採用這兩個日期,以空格分開,還是必須分別提供這兩個日期(2個單一參數)? – Michael 2013-03-05 09:31:52

回答

6

您需要先爲DateTime創建一個解析器,然後再爲您的自定義類型創建一個解析器。這是一個'最簡單的事情,可能有效'的例子。你可能想讓DateTimeParser在它接受的值中更加具體。我不知道你的DataFilterEntity的構造函數是什麼樣的,所以我猜對了:)

public static readonly Parser<DateTime> DateTimeParser = 
    from day in Parse.Number 
    from s1 in Parse.Char('/') 
    from month in Parse.Number 
    from s2 in Parse.Char('/') 
    from year in Parse.Number 
    select new DateTime(int.Parse(year), int.Parse(month), int.Parse(day)); 

public static readonly Parser<DataFilterEntity> CustomParser = 
    from a1 in Parse.String("custom").Token() 
    from fromDateTime in DateTimeParser.Token() 
    from toDateTime in DateTimeParser.Token() 
    select new DataFilterEntity(fromDateTime.ToShortDateString() + " -> " + toDateTime.ToShortDateString()); 

public static readonly Parser<DataFilterEntity> TimeFilter = 
    Parse.String("today").Return(DataFilterEntity.Today) 
     .Or(Parse.String("yesterday").Return(DataFilterEntity.Yesterday) 
     .Or(Parse.String("last week").Return(DataFilterEntity.LastWeek) 
     .Or(Parse.String("last month").Return(DataFilterEntity.LastMonth) 
     .Or(Parse.String("none").Return(DataFilterEntity.None)) 
     .Or(CustomParser)))); 

public void TestIt() 
{ 
    var result = TimeFilter.Parse("custom 21/3/2013 10/4/2013"); 
    Console.Out.WriteLine("result.Value = {0}", result.Value); 
} 
+0

我是綠色的...謝謝邁克。偉大的圖書館BTW。 :) – 2013-03-05 10:11:40

+0

Nick Blumhardt是作者,我只是爲他照顧它。 – 2013-03-05 10:37:01