2012-06-06 53 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的专家,但在线上有足够的示例,您应该可以创建一个可行的示例。