0

我想阅读一个如下所示的文本文件。它有几何名称——>“hvac,OUTLET,INLET,Lamelle,duct and wall”

在这种情况下只有6个,但我可能会根据CFD过程的不同模拟而有所不同。

我只想提取几何名称及其相应的“类型”。在我的例子中,几何和类型分别是“hvac,OUTLET,INLET,Lamelle,duct and wall”和“wall and patch”。

我应该使用 Parse using XML 还是只搜索 '{\n' 和 '}\n' Keyword 之后的字符串。

geometry
{
    hvac
    {
        type            wall;
        inGroups        1(wall);
        nFaces          904403;
        startFace       38432281;
    }
    OUTLET
    {
        type            patch;
        nFaces          8228;
        startFace       39336684;
    }
    INLET
    {
        type            patch;
        nFaces          347;
        startFace       39344912;
    }
    Lamelle
    {
        type            wall;
        inGroups        1(wall);
        nFaces          204538;
        startFace       39345259;
    }
    duct
    {
        type            wall;
        inGroups        1(wall);
        nFaces          535136;
        startFace       39549797;
    }
    wall
    {
        type            wall;
        inGroups        1(wall);
        nFaces          118659;
        startFace       40084933;
    }
}
4

1 回答 1

0

答案取决于您是否要支持整个通用 OpenFOAM 的字典格式。

如果您只需要支持类似于您在问题中显示的格式,那么一个简单的正则表达式\b(\w+)\s+{\s+type\s+(\w+);就可以了:https ://regex101.com/r/yV8tK2/1 。如果您完全控制如何创建此字典,这可能是您的选择,但在这种情况下,直接从创建字典的代码中获取所需信息可能会更简单。

但是,OpenFOAM 的字典格式比您的示例丰富得多。它可以允许#include指令,可以允许正则表达式作为键,可以允许使用$语法引用其他键,可以允许注释、C++ 代码片段以及可能更多(我不假装很了解)。一个典型的例子可以是两个字典:

---- File data.incl:

baseType wall;

---- File data

#inputMode merge;
#include "data.incl"

geometry {
    /* foo {    
        type wrongType; // a commented entry
    } */ 
    foo {
        type $baseType; // this will expand to wall
        ...
    }
    "(bar|buz)" {  // this will match bar and buz
         ...
    } 
}

如果您需要解析任何此类字典,那么我强烈建议您使用 C++ 编写代码并使用标准 OpenFOAM 类,这样您只需几行代码即可完成此操作。

于 2015-07-02T10:27:03.360 回答