2012-06-06 50 views
0

我想解析MVC C#中的文件,請參閱下面的格式。由於它不在JSON中,我不能使用JavaScript序列化程序反序列化爲一個對象。另一個選項是用於LINQ並逐行讀取並檢索所需的值。任何人都可以推薦一種更有效的方式來做到這一點。C#解析文本文件

我需要檢索的第一個字段是來自ASSAYS 的ASSAY NUMBER(例如值877),然後是來自TEST_REPLICATE的ASSAY_STATUS字段,可能是多個節點。由於

LOAD_HEADER 
{ 
    EXPERIMENT_FILE_NAME  "xyz.json" 
    EXPERIMENT_START_DATE_TIME 05.21.2012 03:44:01 
    OPERATOR_ID  "Q_SI" 
} 
ASSAYS 
{ 
    ASSAY_NUMBER   877 
    ASSAY_VERSION   4 
    ASSAY_CALIBRATION_VERSION 1 
} 

TEST_REPLICATE 
{ 
    REPLICATE_ID   1985 
    ASSAY_NUMBER   877 
    ASSAY_VERSION   4 
    ASSAY_STATUS   Research 
} 
TEST_REPLICATE 
{ 
    REPLICATE_ID   1985 
    ASSAY_NUMBER   877 
    ASSAY_VERSION   4 
    ASSAY_STATUS   Research 
} 
+1

最好的解決方案是爲這個DSL使用或編寫解析器。但是,如果它足夠簡單(並且假設引號中的字符串不能包含轉義字符或大括號),那麼您可能會通過粗略的字符串操作來獲得。 –

+1

'任何人都可以推薦一種更有效的方法嗎?顯示您的低效版本,以便我可以考慮更高效的方法。或者我應該把它解釋爲「爲我寫代碼」? –

+0

是的,如果你有代碼解決方案請分享 –

回答

0

你既可以一起砍東西或使用的解析器生成像ANTLRCoco/R。兩者都可以在C#中生成解析器。

0

我比解析器生成器更喜歡使用解析器組合器(一種使用解析器構建塊構建解析器的工具)。我有Piglet,這是用C /編寫的,並且非常易於使用,並且與FParsec有驚人的體驗,但是它是爲F#編寫的。

就語法分析器生成器而言,有一些stmax建議,也有TinyPG,這是一個成員推薦我一次。

您也可以推出自己的解析器。我建議將它建立在某種狀態機模型上,儘管在這個簡單的例子中,就像Kirk Woll所建議的那樣,你可能會用一些普通的舊字符串操作。

+0

你能舉一個例子嗎 –

+0

例子是什麼?哪一個?我建議去解析器組合器,除非你有一個不這樣做的理由。我想如果你檢查出小豬,你會看到一半的工作已經完成了。 – GregRos

0

我認爲這個答案取決於文件中是否會有多個ASSAY_NUMBER值。如果是這樣,我知道的最簡單最可靠的方法是逐行讀取文件並獲取所需的數據。

但是,如果您知道每個文件對於特定的ASSY_NUMBER都是唯一的,那麼您的答案會簡單得多:將文件作爲一個字符串讀取,並使用REGEX來提取所需的信息。我不是REGEX的專家,但在線上有足夠的示例,您應該可以創建一個可行的示例。