C#解析文本文件

时间:2012-06-06 19:17:27

标签: c# json linq parsing

我正在尝试解析MVC C#中的文件,请参阅下面的格式。由于它不在JSON中,我无法使用Javascript序列化程序反序列化为对象。另一个选项是用于LINQ并逐行读取并检索所需的值。任何人都可以推荐一种更有效的方法。

我需要检索的第一个字段是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
}

3 个答案:

答案 0 :(得分:0)

您既可以一起破解某些内容,也可以使用ANTLRCoco/R等解析器生成器。两者都可以在C#中生成解析器。

答案 1 :(得分:0)

我更喜欢使用解析器组合器(一种使用解析器构建块构建解析器的工具)而不是解析器生成器。我有Piglet的可用经验,用C#编写,并且非常易于使用,并且使用FParsec获得了惊人的体验,但它是为F#编写的。

就解析器生成器而言,有stmax建议的那些,还有TinyPG,一位成员推荐我一次。

您也可以滚动自己的解析器。我建议将它基于某种状态机模型,尽管在这个简单的情况下,像Kirk Woll建议的那样,你可能会通过一些简单的旧字符串操作来实现。

答案 2 :(得分:0)

我认为这个问题的答案取决于文件中是否会有多个ASSAY_NUMBER值。如果是这样,我知道的最简单和最可靠的方法是逐行读取文件并获取所需的数据。

但是,如果你知道每个文件对于特定的ASSY_NUMBER是唯一的,那么你有一个更简单的答案:将文件作为一个字符串读取并使用REGEX来提取所需的信息。我不是REGEX的专家,但网上有足够的例子,你应该能够创建一个有效的例子。